backports 3.6.0 → 3.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (275) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +3 -1
  4. data/README.rdoc +6 -2
  5. data/backports.gemspec +1 -1
  6. data/lib/backports/1.8.7.rb +1 -0
  7. data/lib/backports/1.8.7/argf.rb +1 -1
  8. data/lib/backports/1.8.7/argf/each.rb +1 -1
  9. data/lib/backports/1.8.7/argf/each_byte.rb +1 -1
  10. data/lib/backports/1.8.7/argf/each_char.rb +1 -1
  11. data/lib/backports/1.8.7/argf/each_line.rb +1 -1
  12. data/lib/backports/1.8.7/argf/getbyte.rb +1 -1
  13. data/lib/backports/1.8.7/argf/readbyte.rb +1 -1
  14. data/lib/backports/1.8.7/array.rb +1 -1
  15. data/lib/backports/1.8.7/array/collect.rb +1 -1
  16. data/lib/backports/1.8.7/array/combination.rb +1 -1
  17. data/lib/backports/1.8.7/array/cycle.rb +1 -1
  18. data/lib/backports/1.8.7/array/delete_if.rb +1 -1
  19. data/lib/backports/1.8.7/array/each.rb +1 -1
  20. data/lib/backports/1.8.7/array/each_index.rb +1 -1
  21. data/lib/backports/1.8.7/array/flatten.rb +2 -1
  22. data/lib/backports/1.8.7/array/index.rb +1 -1
  23. data/lib/backports/1.8.7/array/map.rb +1 -1
  24. data/lib/backports/1.8.7/array/permutation.rb +1 -1
  25. data/lib/backports/1.8.7/array/pop.rb +2 -1
  26. data/lib/backports/1.8.7/array/product.rb +1 -1
  27. data/lib/backports/1.8.7/array/reject.rb +1 -1
  28. data/lib/backports/1.8.7/array/reverse_each.rb +1 -1
  29. data/lib/backports/1.8.7/array/rindex.rb +1 -1
  30. data/lib/backports/1.8.7/array/select.rb +1 -1
  31. data/lib/backports/1.8.7/array/shift.rb +2 -1
  32. data/lib/backports/1.8.7/binding.rb +1 -1
  33. data/lib/backports/1.8.7/dir.rb +1 -1
  34. data/lib/backports/1.8.7/dir/each.rb +1 -1
  35. data/lib/backports/1.8.7/enumerable.rb +1 -1
  36. data/lib/backports/1.8.7/enumerable/count.rb +1 -1
  37. data/lib/backports/1.8.7/enumerable/cycle.rb +1 -1
  38. data/lib/backports/1.8.7/enumerable/detect.rb +1 -1
  39. data/lib/backports/1.8.7/enumerable/drop.rb +1 -1
  40. data/lib/backports/1.8.7/enumerable/each_cons.rb +1 -1
  41. data/lib/backports/1.8.7/enumerable/each_slice.rb +1 -1
  42. data/lib/backports/1.8.7/enumerable/each_with_index.rb +1 -1
  43. data/lib/backports/1.8.7/enumerable/entries.rb +1 -1
  44. data/lib/backports/1.8.7/enumerable/find.rb +1 -1
  45. data/lib/backports/1.8.7/enumerable/find_all.rb +1 -1
  46. data/lib/backports/1.8.7/enumerable/find_index.rb +1 -1
  47. data/lib/backports/1.8.7/enumerable/first.rb +1 -1
  48. data/lib/backports/1.8.7/enumerable/inject.rb +2 -1
  49. data/lib/backports/1.8.7/enumerable/max_by.rb +1 -1
  50. data/lib/backports/1.8.7/enumerable/min_by.rb +1 -1
  51. data/lib/backports/1.8.7/enumerable/minmax.rb +1 -1
  52. data/lib/backports/1.8.7/enumerable/minmax_by.rb +1 -1
  53. data/lib/backports/1.8.7/enumerable/partition.rb +1 -1
  54. data/lib/backports/1.8.7/enumerable/reject.rb +1 -1
  55. data/lib/backports/1.8.7/enumerable/select.rb +1 -1
  56. data/lib/backports/1.8.7/enumerable/sort_by.rb +1 -1
  57. data/lib/backports/1.8.7/enumerable/to_a.rb +1 -1
  58. data/lib/backports/1.8.7/enumerator.rb +1 -1
  59. data/lib/backports/1.8.7/enumerator/each.rb +1 -1
  60. data/lib/backports/1.8.7/env.rb +1 -1
  61. data/lib/backports/1.8.7/env/delete_if.rb +1 -1
  62. data/lib/backports/1.8.7/env/each.rb +1 -1
  63. data/lib/backports/1.8.7/env/each_key.rb +1 -1
  64. data/lib/backports/1.8.7/env/each_pair.rb +1 -1
  65. data/lib/backports/1.8.7/env/each_value.rb +1 -1
  66. data/lib/backports/1.8.7/env/reject.rb +1 -1
  67. data/lib/backports/1.8.7/env/select.rb +1 -1
  68. data/lib/backports/1.8.7/fixnum.rb +1 -1
  69. data/lib/backports/1.8.7/float.rb +1 -1
  70. data/lib/backports/1.8.7/gc.rb +1 -1
  71. data/lib/backports/1.8.7/hash.rb +1 -1
  72. data/lib/backports/1.8.7/hash/constructor.rb +1 -1
  73. data/lib/backports/1.8.7/hash/delete_if.rb +1 -1
  74. data/lib/backports/1.8.7/hash/each.rb +1 -1
  75. data/lib/backports/1.8.7/hash/each_key.rb +1 -1
  76. data/lib/backports/1.8.7/hash/each_pair.rb +1 -1
  77. data/lib/backports/1.8.7/hash/each_value.rb +1 -1
  78. data/lib/backports/1.8.7/hash/reject.rb +1 -1
  79. data/lib/backports/1.8.7/hash/select.rb +1 -1
  80. data/lib/backports/1.8.7/integer.rb +1 -1
  81. data/lib/backports/1.8.7/integer/downto.rb +1 -1
  82. data/lib/backports/1.8.7/integer/times.rb +1 -1
  83. data/lib/backports/1.8.7/integer/upto.rb +1 -1
  84. data/lib/backports/1.8.7/io.rb +1 -1
  85. data/lib/backports/1.8.7/io/each.rb +1 -1
  86. data/lib/backports/1.8.7/io/each_byte.rb +1 -1
  87. data/lib/backports/1.8.7/io/each_line.rb +1 -1
  88. data/lib/backports/1.8.7/io/foreach.rb +1 -1
  89. data/lib/backports/1.8.7/io/getbyte.rb +1 -1
  90. data/lib/backports/1.8.7/io/readbyte.rb +1 -1
  91. data/lib/backports/1.8.7/kernel.rb +1 -1
  92. data/lib/backports/1.8.7/method.rb +1 -1
  93. data/lib/backports/1.8.7/method/name.rb +1 -1
  94. data/lib/backports/1.8.7/module.rb +1 -1
  95. data/lib/backports/1.8.7/module/module_exec.rb +1 -1
  96. data/lib/backports/1.8.7/numeric.rb +1 -1
  97. data/lib/backports/1.8.7/numeric/step.rb +1 -1
  98. data/lib/backports/1.8.7/object_space.rb +1 -1
  99. data/lib/backports/1.8.7/object_space/each_object.rb +1 -1
  100. data/lib/backports/1.8.7/process.rb +1 -1
  101. data/lib/backports/1.8.7/range.rb +1 -1
  102. data/lib/backports/1.8.7/range/each.rb +1 -1
  103. data/lib/backports/1.8.7/range/step.rb +1 -1
  104. data/lib/backports/1.8.7/regexp.rb +1 -1
  105. data/lib/backports/1.8.7/regexp/union.rb +1 -1
  106. data/lib/backports/1.8.7/stop_iteration.rb +2 -2
  107. data/lib/backports/1.8.7/string.rb +1 -1
  108. data/lib/backports/1.8.7/string/bytesize.rb +1 -1
  109. data/lib/backports/1.8.7/string/each.rb +1 -1
  110. data/lib/backports/1.8.7/string/each_byte.rb +1 -1
  111. data/lib/backports/1.8.7/string/each_char.rb +1 -1
  112. data/lib/backports/1.8.7/string/each_line.rb +1 -1
  113. data/lib/backports/1.8.7/string/partition.rb +2 -1
  114. data/lib/backports/1.8.7/string/rpartition.rb +1 -1
  115. data/lib/backports/1.8.7/string/upto.rb +1 -1
  116. data/lib/backports/1.8.7/struct.rb +1 -1
  117. data/lib/backports/1.8.7/struct/each.rb +1 -1
  118. data/lib/backports/1.8.7/struct/each_pair.rb +1 -1
  119. data/lib/backports/1.8.7/symbol.rb +1 -1
  120. data/lib/backports/1.9.1/array.rb +1 -1
  121. data/lib/backports/1.9.1/array/sample.rb +1 -1
  122. data/lib/backports/1.9.1/array/try_convert.rb +1 -1
  123. data/lib/backports/1.9.1/dir.rb +1 -1
  124. data/lib/backports/1.9.1/dir/to_path.rb +1 -1
  125. data/lib/backports/1.9.1/enumerable.rb +1 -1
  126. data/lib/backports/1.9.1/enumerable/each_with_index.rb +1 -1
  127. data/lib/backports/1.9.1/enumerator.rb +1 -1
  128. data/lib/backports/1.9.1/enumerator/new.rb +1 -1
  129. data/lib/backports/1.9.1/enumerator/with_object.rb +1 -1
  130. data/lib/backports/1.9.1/env.rb +1 -1
  131. data/lib/backports/1.9.1/env/key.rb +1 -1
  132. data/lib/backports/1.9.1/file.rb +1 -1
  133. data/lib/backports/1.9.1/file/atime.rb +1 -1
  134. data/lib/backports/1.9.1/file/basename.rb +1 -1
  135. data/lib/backports/1.9.1/file/blockdev.rb +1 -1
  136. data/lib/backports/1.9.1/file/chardev.rb +1 -1
  137. data/lib/backports/1.9.1/file/chmod.rb +1 -1
  138. data/lib/backports/1.9.1/file/chown.rb +1 -1
  139. data/lib/backports/1.9.1/file/ctime.rb +1 -1
  140. data/lib/backports/1.9.1/file/delete.rb +1 -1
  141. data/lib/backports/1.9.1/file/directory.rb +1 -1
  142. data/lib/backports/1.9.1/file/dirname.rb +1 -1
  143. data/lib/backports/1.9.1/file/executable.rb +1 -1
  144. data/lib/backports/1.9.1/file/executable_real.rb +1 -1
  145. data/lib/backports/1.9.1/file/exist.rb +1 -1
  146. data/lib/backports/1.9.1/file/exists.rb +1 -1
  147. data/lib/backports/1.9.1/file/expand_path.rb +1 -1
  148. data/lib/backports/1.9.1/file/extname.rb +1 -1
  149. data/lib/backports/1.9.1/file/file.rb +1 -1
  150. data/lib/backports/1.9.1/file/ftype.rb +1 -1
  151. data/lib/backports/1.9.1/file/grpowned.rb +1 -1
  152. data/lib/backports/1.9.1/file/join.rb +1 -1
  153. data/lib/backports/1.9.1/file/lchmod.rb +1 -1
  154. data/lib/backports/1.9.1/file/lchown.rb +1 -1
  155. data/lib/backports/1.9.1/file/link.rb +1 -1
  156. data/lib/backports/1.9.1/file/lstat.rb +1 -1
  157. data/lib/backports/1.9.1/file/mtime.rb +1 -1
  158. data/lib/backports/1.9.1/file/new.rb +1 -1
  159. data/lib/backports/1.9.1/file/open.rb +3 -2
  160. data/lib/backports/1.9.1/file/owned.rb +1 -1
  161. data/lib/backports/1.9.1/file/pipe.rb +1 -1
  162. data/lib/backports/1.9.1/file/readable.rb +1 -1
  163. data/lib/backports/1.9.1/file/readable_real.rb +1 -1
  164. data/lib/backports/1.9.1/file/readlink.rb +1 -1
  165. data/lib/backports/1.9.1/file/rename.rb +1 -1
  166. data/lib/backports/1.9.1/file/setgid.rb +1 -1
  167. data/lib/backports/1.9.1/file/setuid.rb +1 -1
  168. data/lib/backports/1.9.1/file/size.rb +1 -1
  169. data/lib/backports/1.9.1/file/socket.rb +1 -1
  170. data/lib/backports/1.9.1/file/split.rb +1 -1
  171. data/lib/backports/1.9.1/file/stat.rb +1 -1
  172. data/lib/backports/1.9.1/file/sticky.rb +1 -1
  173. data/lib/backports/1.9.1/file/symlink.rb +1 -1
  174. data/lib/backports/1.9.1/file/to_path.rb +1 -1
  175. data/lib/backports/1.9.1/file/truncate.rb +1 -1
  176. data/lib/backports/1.9.1/file/unlink.rb +1 -1
  177. data/lib/backports/1.9.1/file/writable.rb +1 -1
  178. data/lib/backports/1.9.1/file/writable_real.rb +1 -1
  179. data/lib/backports/1.9.1/file/zero.rb +1 -1
  180. data/lib/backports/1.9.1/float.rb +1 -1
  181. data/lib/backports/1.9.1/float/round.rb +2 -1
  182. data/lib/backports/1.9.1/hash.rb +1 -1
  183. data/lib/backports/1.9.1/hash/default_proc.rb +1 -1
  184. data/lib/backports/1.9.1/hash/key.rb +1 -1
  185. data/lib/backports/1.9.1/hash/try_convert.rb +1 -1
  186. data/lib/backports/1.9.1/integer.rb +1 -1
  187. data/lib/backports/1.9.1/integer/magnitude.rb +1 -1
  188. data/lib/backports/1.9.1/integer/round.rb +2 -1
  189. data/lib/backports/1.9.1/io.rb +1 -1
  190. data/lib/backports/1.9.1/io/binread.rb +1 -1
  191. data/lib/backports/1.9.1/io/open.rb +4 -2
  192. data/lib/backports/1.9.1/io/try_convert.rb +1 -1
  193. data/lib/backports/1.9.1/io/ungetbyte.rb +1 -1
  194. data/lib/backports/1.9.1/kernel.rb +1 -1
  195. data/lib/backports/1.9.1/kernel/require_relative.rb +1 -1
  196. data/lib/backports/1.9.1/math.rb +1 -1
  197. data/lib/backports/1.9.1/math/log.rb +2 -1
  198. data/lib/backports/1.9.1/numeric.rb +1 -1
  199. data/lib/backports/1.9.1/numeric/round.rb +2 -1
  200. data/lib/backports/1.9.1/proc.rb +1 -1
  201. data/lib/backports/1.9.1/proc/lambda.rb +1 -1
  202. data/lib/backports/1.9.1/proc/yield.rb +1 -1
  203. data/lib/backports/1.9.1/range.rb +1 -1
  204. data/lib/backports/1.9.1/range/cover.rb +1 -1
  205. data/lib/backports/1.9.1/regexp.rb +1 -1
  206. data/lib/backports/1.9.1/regexp/try_convert.rb +1 -1
  207. data/lib/backports/1.9.1/string.rb +1 -1
  208. data/lib/backports/1.9.1/string/each_codepoint.rb +1 -1
  209. data/lib/backports/1.9.1/string/getbyte.rb +1 -1
  210. data/lib/backports/1.9.1/string/setbyte.rb +1 -1
  211. data/lib/backports/1.9.1/string/try_convert.rb +1 -1
  212. data/lib/backports/1.9.1/symbol.rb +1 -1
  213. data/lib/backports/1.9.2/array.rb +1 -1
  214. data/lib/backports/1.9.2/array/product.rb +2 -1
  215. data/lib/backports/1.9.2/array/repeated_combination.rb +1 -1
  216. data/lib/backports/1.9.2/array/repeated_permutation.rb +1 -1
  217. data/lib/backports/1.9.2/array/rotate.rb +1 -1
  218. data/lib/backports/1.9.2/array/uniq.rb +2 -2
  219. data/lib/backports/1.9.2/complex.rb +1 -1
  220. data/lib/backports/1.9.2/dir.rb +1 -1
  221. data/lib/backports/1.9.2/enumerable.rb +1 -1
  222. data/lib/backports/1.9.2/enumerable/slice_before.rb +1 -1
  223. data/lib/backports/1.9.2/float.rb +1 -1
  224. data/lib/backports/1.9.2/hash.rb +1 -1
  225. data/lib/backports/1.9.2/kernel.rb +1 -1
  226. data/lib/backports/1.9.2/random.rb +1 -1
  227. data/lib/backports/1.9.3/file.rb +1 -1
  228. data/lib/backports/1.9.3/io.rb +1 -1
  229. data/lib/backports/1.9.3/io/advise.rb +1 -1
  230. data/lib/backports/1.9.3/io/binwrite.rb +1 -1
  231. data/lib/backports/1.9.3/io/write.rb +1 -1
  232. data/lib/backports/1.9.3/string.rb +1 -1
  233. data/lib/backports/1.9.3/string/byteslice.rb +1 -1
  234. data/lib/backports/1.9.3/string/prepend.rb +1 -1
  235. data/lib/backports/2.0.0/array.rb +1 -1
  236. data/lib/backports/2.0.0/enumerable.rb +1 -1
  237. data/lib/backports/2.0.0/enumerable/lazy.rb +1 -1
  238. data/lib/backports/2.0.0/enumerator.rb +1 -1
  239. data/lib/backports/2.0.0/env.rb +1 -1
  240. data/lib/backports/2.0.0/hash.rb +1 -1
  241. data/lib/backports/2.0.0/hash/default_proc.rb +1 -1
  242. data/lib/backports/2.0.0/nil.rb +1 -1
  243. data/lib/backports/2.0.0/range.rb +1 -1
  244. data/lib/backports/2.0.0/struct.rb +1 -1
  245. data/lib/backports/2.1.0/array.rb +1 -1
  246. data/lib/backports/2.1.0/bignum.rb +1 -1
  247. data/lib/backports/2.1.0/enumerable.rb +1 -1
  248. data/lib/backports/2.1.0/enumerable/to_h.rb +1 -1
  249. data/lib/backports/2.1.0/fixnum.rb +1 -1
  250. data/lib/backports/2.1.0/module.rb +1 -1
  251. data/lib/backports/force/enumerable_map.rb +1 -0
  252. data/lib/backports/force/hash_select.rb +1 -0
  253. data/lib/backports/random/MT19937.rb +78 -0
  254. data/lib/backports/random/bits_and_bytes.rb +93 -0
  255. data/lib/backports/random/implementation.rb +94 -0
  256. data/lib/backports/random/load.rb +17 -0
  257. data/lib/backports/std_lib.rb +24 -0
  258. data/lib/backports/tools.rb +2 -357
  259. data/lib/backports/tools/alias_method.rb +8 -0
  260. data/lib/backports/tools/alias_method_chain.rb +26 -0
  261. data/lib/backports/tools/arguments.rb +69 -0
  262. data/lib/backports/tools/extreme_object.rb +12 -0
  263. data/lib/backports/tools/io.rb +57 -0
  264. data/lib/backports/tools/make_block_optional.rb +43 -0
  265. data/lib/backports/tools/path.rb +55 -0
  266. data/lib/backports/tools/require_relative_dir.rb +13 -0
  267. data/lib/backports/tools/std_lib.rb +59 -0
  268. data/lib/backports/tools/suppress_verbose_warnings.rb +9 -0
  269. data/lib/backports/version.rb +1 -1
  270. data/spec/tags/1.8.7/core/module/include_spec.rb +3 -0
  271. metadata +45 -52
  272. data/lib/backports/extra/random/MT19937.rb +0 -76
  273. data/lib/backports/extra/random/bits_and_bytes.rb +0 -91
  274. data/lib/backports/extra/random/implementation.rb +0 -93
  275. data/lib/backports/extra/random/load.rb +0 -17
@@ -1,76 +0,0 @@
1
- class Random
2
- # An implementation of Mersenne Twister MT19937 in Ruby
3
- class MT19937
4
- STATE_SIZE = 624
5
- LAST_STATE = STATE_SIZE - 1
6
- PAD_32_BITS = 0xffffffff
7
-
8
- # See seed=
9
- def initialize(seed)
10
- self.seed = seed
11
- end
12
-
13
- LAST_31_BITS = 0x7fffffff
14
- OFFSET = 397
15
-
16
- # Generates a completely new state out of the previous one.
17
- def next_state
18
- STATE_SIZE.times do |i|
19
- mix = @state[i] & 0x80000000 | @state[i+1 - STATE_SIZE] & 0x7fffffff
20
- @state[i] = @state[i+OFFSET - STATE_SIZE] ^ (mix >> 1)
21
- @state[i] ^= 0x9908b0df if mix.odd?
22
- end
23
- @last_read = -1
24
- end
25
-
26
- # Seed must be either an Integer (only the first 32 bits will be used)
27
- # or an Array of Integers (of which only the first 32 bits will be used)
28
- #
29
- # No conversion or type checking is done at this level
30
- def seed=(seed)
31
- case seed
32
- when Integer
33
- @state = Array.new(STATE_SIZE)
34
- @state[0] = seed & PAD_32_BITS
35
- (1..LAST_STATE).each do |i|
36
- @state[i] = (1812433253 * (@state[i-1] ^ @state[i-1]>>30) + i)& PAD_32_BITS
37
- end
38
- @last_read = LAST_STATE
39
- when Array
40
- self.seed = 19650218
41
- i=1
42
- j=0
43
- [STATE_SIZE, seed.size].max.times do
44
- @state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1664525) + j + seed[j] & PAD_32_BITS
45
- if (i+=1) >= STATE_SIZE
46
- @state[0] = @state[-1]
47
- i = 1
48
- end
49
- j = 0 if (j+=1) >= seed.size
50
- end
51
- (STATE_SIZE-1).times do
52
- @state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1566083941) - i & PAD_32_BITS
53
- if (i+=1) >= STATE_SIZE
54
- @state[0] = @state[-1]
55
- i = 1
56
- end
57
- end
58
- @state[0] = 0x80000000
59
- else
60
- raise ArgumentError, "Seed must be an Integer or an Array"
61
- end
62
- end
63
-
64
- # Returns a random Integer from the range 0 ... (1 << 32)
65
- def random_32_bits
66
- next_state if @last_read >= LAST_STATE
67
- @last_read += 1
68
- y = @state[@last_read]
69
- # Tempering
70
- y ^= (y >> 11)
71
- y ^= (y << 7) & 0x9d2c5680
72
- y ^= (y << 15) & 0xefc60000
73
- y ^= (y >> 18)
74
- end
75
- end
76
- end
@@ -1,91 +0,0 @@
1
- class Random
2
- # Supplement the MT19937 class with methods to do
3
- # conversions the same way as MRI.
4
- # No argument checking is done here either.
5
-
6
- class MT19937
7
- FLOAT_FACTOR = 1.0/9007199254740992.0
8
- # generates a random number on [0,1) with 53-bit resolution
9
- def random_float
10
- ((random_32_bits >> 5) * 67108864.0 + (random_32_bits >> 6)) * FLOAT_FACTOR;
11
- end
12
-
13
- # Returns an integer within 0...upto
14
- def random_integer(upto)
15
- n = upto - 1
16
- nb_full_32 = 0
17
- while n > PAD_32_BITS
18
- n >>= 32
19
- nb_full_32 += 1
20
- end
21
- mask = mask_32_bits(n)
22
- begin
23
- rand = random_32_bits & mask
24
- nb_full_32.times do
25
- rand <<= 32
26
- rand |= random_32_bits
27
- end
28
- end until rand < upto
29
- rand
30
- end
31
-
32
- def random_bytes(nb)
33
- nb_32_bits = (nb + 3) / 4
34
- random = nb_32_bits.times.map { random_32_bits }
35
- random.pack("L" * nb_32_bits)[0, nb]
36
- end
37
-
38
- def state_as_bignum
39
- b = 0
40
- @state.each_with_index do |val, i|
41
- b |= val << (32 * i)
42
- end
43
- b
44
- end
45
-
46
- def left # It's actually the number of words left + 1, as per MRI...
47
- MT19937::STATE_SIZE - @last_read
48
- end
49
-
50
- def marshal_dump
51
- [state_as_bignum, left]
52
- end
53
-
54
- def marshal_load(ary)
55
- b, left = ary
56
- @last_read = MT19937::STATE_SIZE - left
57
- @state = Array.new(STATE_SIZE)
58
- STATE_SIZE.times do |i|
59
- @state[i] = b & PAD_32_BITS
60
- b >>= 32
61
- end
62
- end
63
-
64
- # Convert an Integer seed of arbitrary size to either a single 32 bit integer, or an Array of 32 bit integers
65
- def self.convert_seed(seed)
66
- seed = seed.abs
67
- long_values = []
68
- begin
69
- long_values << (seed & PAD_32_BITS)
70
- seed >>= 32
71
- end until seed == 0
72
-
73
- long_values.pop if long_values[-1] == 1 && long_values.size > 1 # Done to allow any kind of sequence of integers
74
-
75
- long_values.size > 1 ? long_values : long_values.first
76
- end
77
-
78
- def self.[](seed)
79
- new(convert_seed(seed))
80
- end
81
-
82
- private
83
- MASK_BY = [1,2,4,8,16]
84
- def mask_32_bits(n)
85
- MASK_BY.each do |shift|
86
- n |= n >> shift
87
- end
88
- n
89
- end
90
- end
91
- end
@@ -1,93 +0,0 @@
1
- class Random
2
- # Implementation corresponding to the actual Random class of Ruby
3
- # The actual random generator (mersenne twister) is in MT19937.
4
- # Ruby specific conversions are handled in bits_and_bytes.
5
- # The high level stuff (argument checking) is done here.
6
- #
7
- module Implementation
8
- attr_reader :seed
9
-
10
- def initialize(seed = 0)
11
- super()
12
- srand(seed)
13
- end
14
-
15
- def srand(new_seed = 0)
16
- new_seed = Backports.coerce_to_int(new_seed)
17
- old, @seed = @seed, new_seed.nonzero? || Random.new_seed
18
- @mt = MT19937[ @seed ]
19
- old
20
- end
21
-
22
- def rand(limit = Backports::Undefined)
23
- case limit
24
- when Backports::Undefined
25
- @mt.random_float
26
- when Float
27
- limit * @mt.random_float unless limit <= 0
28
- when Range
29
- _rand_range(limit)
30
- else
31
- limit = Backports.coerce_to_int(limit)
32
- @mt.random_integer(limit) unless limit <= 0
33
- end || raise(ArgumentError, "invalid argument #{limit}")
34
- end
35
-
36
- def bytes(nb)
37
- nb = Backports.coerce_to_int(nb)
38
- raise ArgumentError, "negative size" if nb < 0
39
- @mt.random_bytes(nb)
40
- end
41
-
42
- def ==(other)
43
- other.is_a?(Random) &&
44
- seed == other.seed &&
45
- left == other.send(:left) &&
46
- state == other.send(:state)
47
- end
48
-
49
- def marshal_dump
50
- @mt.marshal_dump << @seed
51
- end
52
-
53
- def marshal_load(ary)
54
- @seed = ary.pop
55
- @mt = MT19937.allocate
56
- @mt.marshal_load(ary)
57
- end
58
-
59
- private
60
- def state
61
- @mt.state_as_bignum
62
- end
63
-
64
- def left
65
- @mt.left
66
- end
67
-
68
- def _rand_range(limit)
69
- range = limit.end - limit.begin
70
- if (!range.is_a?(Float)) && range.respond_to?(:to_int) && range = Backports.coerce_to_int(range)
71
- range += 1 unless limit.exclude_end?
72
- limit.begin + @mt.random_integer(range) unless range <= 0
73
- elsif range = Backports.coerce_to(range, Float, :to_f)
74
- if range < 0
75
- nil
76
- elsif limit.exclude_end?
77
- limit.begin + @mt.random_float * range unless range <= 0
78
- else
79
- # cheat a bit... this will reduce the nb of random bits
80
- loop do
81
- r = @mt.random_float * range * 1.0001
82
- break limit.begin + r unless r > range
83
- end
84
- end
85
- end
86
- end
87
- end
88
-
89
- def self.new_seed
90
- Kernel::srand # use the built-in seed generator
91
- Kernel::srand # return the generated seed
92
- end
93
- end
@@ -1,17 +0,0 @@
1
- require "backports/tools"
2
- require "backports/extra/random/MT19937"
3
- require "backports/extra/random/bits_and_bytes"
4
- require "backports/extra/random/implementation"
5
-
6
- class Random
7
- include Implementation
8
- class << self
9
- include Implementation
10
- end
11
-
12
- def inspect
13
- "#<#{self.class.name}:#{object_id}>"
14
- end
15
-
16
- srand
17
- end