Guest User

Untitled

a guest
Jul 20th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. " glibc-2.12.1: random_r.c
  2.  
  3. let s:RAND_MAX = 2147483647
  4.  
  5. function! Srand(seed)
  6. call s:srandom_r(a:seed, s:state)
  7. endfunction
  8.  
  9. function! Rand()
  10. return s:random_r(s:state)
  11. endfunction
  12.  
  13. " Linear congruential.
  14. let s:TYPE_0 = 0
  15. let s:BREAK_0 = 8
  16. let s:DEG_0 = 0
  17. let s:SEP_0 = 0
  18.  
  19. " x**7 + x**3 + 1.
  20. let s:TYPE_1 = 1
  21. let s:BREAK_1 = 32
  22. let s:DEG_1 = 7
  23. let s:SEP_1 = 3
  24.  
  25. " x**15 + x + 1.
  26. let s:TYPE_2 = 2
  27. let s:BREAK_2 = 64
  28. let s:DEG_2 = 15
  29. let s:SEP_2 = 1
  30.  
  31. " x**31 + x**3 + 1.
  32. let s:TYPE_3 = 3
  33. let s:BREAK_3 = 128
  34. let s:DEG_3 = 31
  35. let s:SEP_3 = 3
  36.  
  37. " x**63 + x + 1.
  38. let s:TYPE_4 = 4
  39. let s:BREAK_4 = 256
  40. let s:DEG_4 = 63
  41. let s:SEP_4 = 1
  42.  
  43. let s:MAX_TYPES = 5
  44.  
  45. let s:randtbl = [
  46. \ s:TYPE_3,
  47. \
  48. \ -1726662223, 379960547, 1735697613, 1040273694, 1313901226,
  49. \ 1627687941, -179304937, -2073333483, 1780058412, -1989503057,
  50. \ -615974602, 344556628, 939512070, -1249116260, 1507946756,
  51. \ -812545463, 154635395, 1388815473, -1926676823, 525320961,
  52. \ -1009028674, 968117788, -123449607, 1284210865, 435012392,
  53. \ -2017506339, -911064859, -370259173, 1132637927, 1398500161,
  54. \ -205601318,
  55. \ ]
  56.  
  57. let s:state = {
  58. \ 'tbl': s:randtbl,
  59. \ 'fptr': s:SEP_3 + 1,
  60. \ 'rptr': 1,
  61. \ 'state': 1,
  62. \ 'rand_type': s:TYPE_3,
  63. \ 'rand_deg': s:DEG_3,
  64. \ 'rand_sep': s:SEP_3,
  65. \ 'end_ptr': len(s:randtbl),
  66. \ }
  67.  
  68. function! s:srandom_r(seed, buf)
  69. let type = a:buf.rand_type
  70.  
  71. let state = a:buf.state
  72. let seed = (a:seed == 0) ? 1 : a:seed
  73. let a:buf.tbl[state] = seed
  74. if type == s:TYPE_0
  75. return
  76. endif
  77.  
  78. let dst = state
  79. let word = seed
  80. let kc = a:buf.rand_deg
  81. for i in range(kc - 1)
  82. let hi = word / 127773
  83. let lo = word % 127773
  84. let word = 16807 * lo - 2836 * hi
  85. if word < 0
  86. let word += 2147483647
  87. endif
  88. let dst += 1
  89. let a:buf.tbl[dst] = word
  90. endfor
  91.  
  92. let a:buf.fptr = state + a:buf.rand_sep
  93. let a:buf.rptr = state
  94. let kc = kc * 10
  95. for i in range(kc)
  96. call s:random_r(a:buf)
  97. endfor
  98. endfunction
  99.  
  100. function! s:random_r(buf)
  101. let state = a:buf.state
  102.  
  103. if a:buf.rand_type == s:TYPE_0
  104. " val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
  105. let val = (a:buf.tbl[state] * 1103515245) + 12345
  106. if val < 0
  107. let val -= 0x80000000
  108. endif
  109. let a:buf.tbl[state] = val
  110. let result = val
  111. else
  112. let fptr = a:buf.fptr
  113. let rptr = a:buf.rptr
  114. let end_ptr = a:buf.end_ptr
  115.  
  116. let a:buf.tbl[fptr] += a:buf.tbl[rptr]
  117. let val = a:buf.tbl[fptr]
  118. " result = (val >> 1) & 0x7fffffff
  119. if val < 0
  120. let result = ((val - 0x80000000) / 2) + 0x40000000
  121. else
  122. let result = val / 2
  123. endif
  124. let fptr += 1
  125. if fptr >= end_ptr
  126. let fptr = state
  127. let rptr += 1
  128. else
  129. let rptr += 1
  130. if rptr >= end_ptr
  131. let rptr = state
  132. endif
  133. endif
  134. let a:buf.fptr = fptr
  135. let a:buf.rptr = rptr
  136. endif
  137.  
  138. return result
  139. endfunction
Add Comment
Please, Sign In to add comment