backports 3.6.0 → 3.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|