backports 3.6.0 → 3.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +3 -1
- data/README.rdoc +6 -2
- data/backports.gemspec +1 -1
- data/lib/backports/1.8.7.rb +1 -0
- data/lib/backports/1.8.7/argf.rb +1 -1
- data/lib/backports/1.8.7/argf/each.rb +1 -1
- data/lib/backports/1.8.7/argf/each_byte.rb +1 -1
- data/lib/backports/1.8.7/argf/each_char.rb +1 -1
- data/lib/backports/1.8.7/argf/each_line.rb +1 -1
- data/lib/backports/1.8.7/argf/getbyte.rb +1 -1
- data/lib/backports/1.8.7/argf/readbyte.rb +1 -1
- data/lib/backports/1.8.7/array.rb +1 -1
- data/lib/backports/1.8.7/array/collect.rb +1 -1
- data/lib/backports/1.8.7/array/combination.rb +1 -1
- data/lib/backports/1.8.7/array/cycle.rb +1 -1
- data/lib/backports/1.8.7/array/delete_if.rb +1 -1
- data/lib/backports/1.8.7/array/each.rb +1 -1
- data/lib/backports/1.8.7/array/each_index.rb +1 -1
- data/lib/backports/1.8.7/array/flatten.rb +2 -1
- data/lib/backports/1.8.7/array/index.rb +1 -1
- data/lib/backports/1.8.7/array/map.rb +1 -1
- data/lib/backports/1.8.7/array/permutation.rb +1 -1
- data/lib/backports/1.8.7/array/pop.rb +2 -1
- data/lib/backports/1.8.7/array/product.rb +1 -1
- data/lib/backports/1.8.7/array/reject.rb +1 -1
- data/lib/backports/1.8.7/array/reverse_each.rb +1 -1
- data/lib/backports/1.8.7/array/rindex.rb +1 -1
- data/lib/backports/1.8.7/array/select.rb +1 -1
- data/lib/backports/1.8.7/array/shift.rb +2 -1
- data/lib/backports/1.8.7/binding.rb +1 -1
- data/lib/backports/1.8.7/dir.rb +1 -1
- data/lib/backports/1.8.7/dir/each.rb +1 -1
- data/lib/backports/1.8.7/enumerable.rb +1 -1
- data/lib/backports/1.8.7/enumerable/count.rb +1 -1
- data/lib/backports/1.8.7/enumerable/cycle.rb +1 -1
- data/lib/backports/1.8.7/enumerable/detect.rb +1 -1
- data/lib/backports/1.8.7/enumerable/drop.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_cons.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_slice.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_with_index.rb +1 -1
- data/lib/backports/1.8.7/enumerable/entries.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find_all.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find_index.rb +1 -1
- data/lib/backports/1.8.7/enumerable/first.rb +1 -1
- data/lib/backports/1.8.7/enumerable/inject.rb +2 -1
- data/lib/backports/1.8.7/enumerable/max_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/min_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/minmax.rb +1 -1
- data/lib/backports/1.8.7/enumerable/minmax_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/partition.rb +1 -1
- data/lib/backports/1.8.7/enumerable/reject.rb +1 -1
- data/lib/backports/1.8.7/enumerable/select.rb +1 -1
- data/lib/backports/1.8.7/enumerable/sort_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/to_a.rb +1 -1
- data/lib/backports/1.8.7/enumerator.rb +1 -1
- data/lib/backports/1.8.7/enumerator/each.rb +1 -1
- data/lib/backports/1.8.7/env.rb +1 -1
- data/lib/backports/1.8.7/env/delete_if.rb +1 -1
- data/lib/backports/1.8.7/env/each.rb +1 -1
- data/lib/backports/1.8.7/env/each_key.rb +1 -1
- data/lib/backports/1.8.7/env/each_pair.rb +1 -1
- data/lib/backports/1.8.7/env/each_value.rb +1 -1
- data/lib/backports/1.8.7/env/reject.rb +1 -1
- data/lib/backports/1.8.7/env/select.rb +1 -1
- data/lib/backports/1.8.7/fixnum.rb +1 -1
- data/lib/backports/1.8.7/float.rb +1 -1
- data/lib/backports/1.8.7/gc.rb +1 -1
- data/lib/backports/1.8.7/hash.rb +1 -1
- data/lib/backports/1.8.7/hash/constructor.rb +1 -1
- data/lib/backports/1.8.7/hash/delete_if.rb +1 -1
- data/lib/backports/1.8.7/hash/each.rb +1 -1
- data/lib/backports/1.8.7/hash/each_key.rb +1 -1
- data/lib/backports/1.8.7/hash/each_pair.rb +1 -1
- data/lib/backports/1.8.7/hash/each_value.rb +1 -1
- data/lib/backports/1.8.7/hash/reject.rb +1 -1
- data/lib/backports/1.8.7/hash/select.rb +1 -1
- data/lib/backports/1.8.7/integer.rb +1 -1
- data/lib/backports/1.8.7/integer/downto.rb +1 -1
- data/lib/backports/1.8.7/integer/times.rb +1 -1
- data/lib/backports/1.8.7/integer/upto.rb +1 -1
- data/lib/backports/1.8.7/io.rb +1 -1
- data/lib/backports/1.8.7/io/each.rb +1 -1
- data/lib/backports/1.8.7/io/each_byte.rb +1 -1
- data/lib/backports/1.8.7/io/each_line.rb +1 -1
- data/lib/backports/1.8.7/io/foreach.rb +1 -1
- data/lib/backports/1.8.7/io/getbyte.rb +1 -1
- data/lib/backports/1.8.7/io/readbyte.rb +1 -1
- data/lib/backports/1.8.7/kernel.rb +1 -1
- data/lib/backports/1.8.7/method.rb +1 -1
- data/lib/backports/1.8.7/method/name.rb +1 -1
- data/lib/backports/1.8.7/module.rb +1 -1
- data/lib/backports/1.8.7/module/module_exec.rb +1 -1
- data/lib/backports/1.8.7/numeric.rb +1 -1
- data/lib/backports/1.8.7/numeric/step.rb +1 -1
- data/lib/backports/1.8.7/object_space.rb +1 -1
- data/lib/backports/1.8.7/object_space/each_object.rb +1 -1
- data/lib/backports/1.8.7/process.rb +1 -1
- data/lib/backports/1.8.7/range.rb +1 -1
- data/lib/backports/1.8.7/range/each.rb +1 -1
- data/lib/backports/1.8.7/range/step.rb +1 -1
- data/lib/backports/1.8.7/regexp.rb +1 -1
- data/lib/backports/1.8.7/regexp/union.rb +1 -1
- data/lib/backports/1.8.7/stop_iteration.rb +2 -2
- data/lib/backports/1.8.7/string.rb +1 -1
- data/lib/backports/1.8.7/string/bytesize.rb +1 -1
- data/lib/backports/1.8.7/string/each.rb +1 -1
- data/lib/backports/1.8.7/string/each_byte.rb +1 -1
- data/lib/backports/1.8.7/string/each_char.rb +1 -1
- data/lib/backports/1.8.7/string/each_line.rb +1 -1
- data/lib/backports/1.8.7/string/partition.rb +2 -1
- data/lib/backports/1.8.7/string/rpartition.rb +1 -1
- data/lib/backports/1.8.7/string/upto.rb +1 -1
- data/lib/backports/1.8.7/struct.rb +1 -1
- data/lib/backports/1.8.7/struct/each.rb +1 -1
- data/lib/backports/1.8.7/struct/each_pair.rb +1 -1
- data/lib/backports/1.8.7/symbol.rb +1 -1
- data/lib/backports/1.9.1/array.rb +1 -1
- data/lib/backports/1.9.1/array/sample.rb +1 -1
- data/lib/backports/1.9.1/array/try_convert.rb +1 -1
- data/lib/backports/1.9.1/dir.rb +1 -1
- data/lib/backports/1.9.1/dir/to_path.rb +1 -1
- data/lib/backports/1.9.1/enumerable.rb +1 -1
- data/lib/backports/1.9.1/enumerable/each_with_index.rb +1 -1
- data/lib/backports/1.9.1/enumerator.rb +1 -1
- data/lib/backports/1.9.1/enumerator/new.rb +1 -1
- data/lib/backports/1.9.1/enumerator/with_object.rb +1 -1
- data/lib/backports/1.9.1/env.rb +1 -1
- data/lib/backports/1.9.1/env/key.rb +1 -1
- data/lib/backports/1.9.1/file.rb +1 -1
- data/lib/backports/1.9.1/file/atime.rb +1 -1
- data/lib/backports/1.9.1/file/basename.rb +1 -1
- data/lib/backports/1.9.1/file/blockdev.rb +1 -1
- data/lib/backports/1.9.1/file/chardev.rb +1 -1
- data/lib/backports/1.9.1/file/chmod.rb +1 -1
- data/lib/backports/1.9.1/file/chown.rb +1 -1
- data/lib/backports/1.9.1/file/ctime.rb +1 -1
- data/lib/backports/1.9.1/file/delete.rb +1 -1
- data/lib/backports/1.9.1/file/directory.rb +1 -1
- data/lib/backports/1.9.1/file/dirname.rb +1 -1
- data/lib/backports/1.9.1/file/executable.rb +1 -1
- data/lib/backports/1.9.1/file/executable_real.rb +1 -1
- data/lib/backports/1.9.1/file/exist.rb +1 -1
- data/lib/backports/1.9.1/file/exists.rb +1 -1
- data/lib/backports/1.9.1/file/expand_path.rb +1 -1
- data/lib/backports/1.9.1/file/extname.rb +1 -1
- data/lib/backports/1.9.1/file/file.rb +1 -1
- data/lib/backports/1.9.1/file/ftype.rb +1 -1
- data/lib/backports/1.9.1/file/grpowned.rb +1 -1
- data/lib/backports/1.9.1/file/join.rb +1 -1
- data/lib/backports/1.9.1/file/lchmod.rb +1 -1
- data/lib/backports/1.9.1/file/lchown.rb +1 -1
- data/lib/backports/1.9.1/file/link.rb +1 -1
- data/lib/backports/1.9.1/file/lstat.rb +1 -1
- data/lib/backports/1.9.1/file/mtime.rb +1 -1
- data/lib/backports/1.9.1/file/new.rb +1 -1
- data/lib/backports/1.9.1/file/open.rb +3 -2
- data/lib/backports/1.9.1/file/owned.rb +1 -1
- data/lib/backports/1.9.1/file/pipe.rb +1 -1
- data/lib/backports/1.9.1/file/readable.rb +1 -1
- data/lib/backports/1.9.1/file/readable_real.rb +1 -1
- data/lib/backports/1.9.1/file/readlink.rb +1 -1
- data/lib/backports/1.9.1/file/rename.rb +1 -1
- data/lib/backports/1.9.1/file/setgid.rb +1 -1
- data/lib/backports/1.9.1/file/setuid.rb +1 -1
- data/lib/backports/1.9.1/file/size.rb +1 -1
- data/lib/backports/1.9.1/file/socket.rb +1 -1
- data/lib/backports/1.9.1/file/split.rb +1 -1
- data/lib/backports/1.9.1/file/stat.rb +1 -1
- data/lib/backports/1.9.1/file/sticky.rb +1 -1
- data/lib/backports/1.9.1/file/symlink.rb +1 -1
- data/lib/backports/1.9.1/file/to_path.rb +1 -1
- data/lib/backports/1.9.1/file/truncate.rb +1 -1
- data/lib/backports/1.9.1/file/unlink.rb +1 -1
- data/lib/backports/1.9.1/file/writable.rb +1 -1
- data/lib/backports/1.9.1/file/writable_real.rb +1 -1
- data/lib/backports/1.9.1/file/zero.rb +1 -1
- data/lib/backports/1.9.1/float.rb +1 -1
- data/lib/backports/1.9.1/float/round.rb +2 -1
- data/lib/backports/1.9.1/hash.rb +1 -1
- data/lib/backports/1.9.1/hash/default_proc.rb +1 -1
- data/lib/backports/1.9.1/hash/key.rb +1 -1
- data/lib/backports/1.9.1/hash/try_convert.rb +1 -1
- data/lib/backports/1.9.1/integer.rb +1 -1
- data/lib/backports/1.9.1/integer/magnitude.rb +1 -1
- data/lib/backports/1.9.1/integer/round.rb +2 -1
- data/lib/backports/1.9.1/io.rb +1 -1
- data/lib/backports/1.9.1/io/binread.rb +1 -1
- data/lib/backports/1.9.1/io/open.rb +4 -2
- data/lib/backports/1.9.1/io/try_convert.rb +1 -1
- data/lib/backports/1.9.1/io/ungetbyte.rb +1 -1
- data/lib/backports/1.9.1/kernel.rb +1 -1
- data/lib/backports/1.9.1/kernel/require_relative.rb +1 -1
- data/lib/backports/1.9.1/math.rb +1 -1
- data/lib/backports/1.9.1/math/log.rb +2 -1
- data/lib/backports/1.9.1/numeric.rb +1 -1
- data/lib/backports/1.9.1/numeric/round.rb +2 -1
- data/lib/backports/1.9.1/proc.rb +1 -1
- data/lib/backports/1.9.1/proc/lambda.rb +1 -1
- data/lib/backports/1.9.1/proc/yield.rb +1 -1
- data/lib/backports/1.9.1/range.rb +1 -1
- data/lib/backports/1.9.1/range/cover.rb +1 -1
- data/lib/backports/1.9.1/regexp.rb +1 -1
- data/lib/backports/1.9.1/regexp/try_convert.rb +1 -1
- data/lib/backports/1.9.1/string.rb +1 -1
- data/lib/backports/1.9.1/string/each_codepoint.rb +1 -1
- data/lib/backports/1.9.1/string/getbyte.rb +1 -1
- data/lib/backports/1.9.1/string/setbyte.rb +1 -1
- data/lib/backports/1.9.1/string/try_convert.rb +1 -1
- data/lib/backports/1.9.1/symbol.rb +1 -1
- data/lib/backports/1.9.2/array.rb +1 -1
- data/lib/backports/1.9.2/array/product.rb +2 -1
- data/lib/backports/1.9.2/array/repeated_combination.rb +1 -1
- data/lib/backports/1.9.2/array/repeated_permutation.rb +1 -1
- data/lib/backports/1.9.2/array/rotate.rb +1 -1
- data/lib/backports/1.9.2/array/uniq.rb +2 -2
- data/lib/backports/1.9.2/complex.rb +1 -1
- data/lib/backports/1.9.2/dir.rb +1 -1
- data/lib/backports/1.9.2/enumerable.rb +1 -1
- data/lib/backports/1.9.2/enumerable/slice_before.rb +1 -1
- data/lib/backports/1.9.2/float.rb +1 -1
- data/lib/backports/1.9.2/hash.rb +1 -1
- data/lib/backports/1.9.2/kernel.rb +1 -1
- data/lib/backports/1.9.2/random.rb +1 -1
- data/lib/backports/1.9.3/file.rb +1 -1
- data/lib/backports/1.9.3/io.rb +1 -1
- data/lib/backports/1.9.3/io/advise.rb +1 -1
- data/lib/backports/1.9.3/io/binwrite.rb +1 -1
- data/lib/backports/1.9.3/io/write.rb +1 -1
- data/lib/backports/1.9.3/string.rb +1 -1
- data/lib/backports/1.9.3/string/byteslice.rb +1 -1
- data/lib/backports/1.9.3/string/prepend.rb +1 -1
- data/lib/backports/2.0.0/array.rb +1 -1
- data/lib/backports/2.0.0/enumerable.rb +1 -1
- data/lib/backports/2.0.0/enumerable/lazy.rb +1 -1
- data/lib/backports/2.0.0/enumerator.rb +1 -1
- data/lib/backports/2.0.0/env.rb +1 -1
- data/lib/backports/2.0.0/hash.rb +1 -1
- data/lib/backports/2.0.0/hash/default_proc.rb +1 -1
- data/lib/backports/2.0.0/nil.rb +1 -1
- data/lib/backports/2.0.0/range.rb +1 -1
- data/lib/backports/2.0.0/struct.rb +1 -1
- data/lib/backports/2.1.0/array.rb +1 -1
- data/lib/backports/2.1.0/bignum.rb +1 -1
- data/lib/backports/2.1.0/enumerable.rb +1 -1
- data/lib/backports/2.1.0/enumerable/to_h.rb +1 -1
- data/lib/backports/2.1.0/fixnum.rb +1 -1
- data/lib/backports/2.1.0/module.rb +1 -1
- data/lib/backports/force/enumerable_map.rb +1 -0
- data/lib/backports/force/hash_select.rb +1 -0
- data/lib/backports/random/MT19937.rb +78 -0
- data/lib/backports/random/bits_and_bytes.rb +93 -0
- data/lib/backports/random/implementation.rb +94 -0
- data/lib/backports/random/load.rb +17 -0
- data/lib/backports/std_lib.rb +24 -0
- data/lib/backports/tools.rb +2 -357
- data/lib/backports/tools/alias_method.rb +8 -0
- data/lib/backports/tools/alias_method_chain.rb +26 -0
- data/lib/backports/tools/arguments.rb +69 -0
- data/lib/backports/tools/extreme_object.rb +12 -0
- data/lib/backports/tools/io.rb +57 -0
- data/lib/backports/tools/make_block_optional.rb +43 -0
- data/lib/backports/tools/path.rb +55 -0
- data/lib/backports/tools/require_relative_dir.rb +13 -0
- data/lib/backports/tools/std_lib.rb +59 -0
- data/lib/backports/tools/suppress_verbose_warnings.rb +9 -0
- data/lib/backports/version.rb +1 -1
- data/spec/tags/1.8.7/core/module/include_spec.rb +3 -0
- metadata +45 -52
- data/lib/backports/extra/random/MT19937.rb +0 -76
- data/lib/backports/extra/random/bits_and_bytes.rb +0 -91
- data/lib/backports/extra/random/implementation.rb +0 -93
- 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
|