require 'test/unit' class TestRand < Test::Unit::TestCase def assert_random_int(ws, m, init = 0) srand(init) rnds = [Random.new(init)] rnds2 = [rnds[0].dup] rnds3 = [rnds[0].dup] ws.each_with_index do |w, i| w = w.to_i assert_equal(w, rand(m)) rnds.each do |rnd| assert_equal(w, rnd.rand(m)) end rnds2.each do |rnd| r=rnd.rand(i...(m+i)) assert_equal(w+i, r) end rnds3.each do |rnd| r=rnd.rand(i..(m+i-1)) assert_equal(w+i, r) end rnds << Marshal.load(Marshal.dump(rnds[-1])) rnds2 << Marshal.load(Marshal.dump(rnds2[-1])) end end def test_mt assert_random_int(%w(1067595299 955945823 477289528 4107218783 4228976476), 0x100000000, 0x00000456_00000345_00000234_00000123) end def test_0x3fffffff assert_random_int(%w(209652396 398764591 924231285 404868288 441365315), 0x3fffffff) end def test_0x40000000 assert_random_int(%w(209652396 398764591 924231285 404868288 441365315), 0x40000000) end def test_0x40000001 assert_random_int(%w(209652396 398764591 924231285 441365315 192771779), 0x40000001) end def test_0xffffffff assert_random_int(%w(2357136044 2546248239 3071714933 3626093760 2588848963), 0xffffffff) end def test_0x100000000 assert_random_int(%w(2357136044 2546248239 3071714933 3626093760 2588848963), 0x100000000) end def test_0x100000001 assert_random_int(%w(2546248239 1277901399 243580376 1171049868 2051556033), 0x100000001) end def test_rand_0x100000000 assert_random_int(%w(4119812344 3870378946 80324654 4294967296 410016213), 0x100000001, 311702798) end def test_0x1000000000000 assert_random_int(%w(11736396900911 183025067478208 197104029029115 130583529618791 180361239846611), 0x1000000000000) end def test_0x1000000000001 assert_random_int(%w(187121911899765 197104029029115 180361239846611 236336749852452 208739549485656), 0x1000000000001) end def test_0x3fffffffffffffff assert_random_int(%w(900450186894289455 3969543146641149120 1895649597198586619 827948490035658087 3203365596207111891), 0x3fffffffffffffff) end def test_0x4000000000000000 assert_random_int(%w(900450186894289455 3969543146641149120 1895649597198586619 827948490035658087 3203365596207111891), 0x4000000000000000) end def test_0x4000000000000001 assert_random_int(%w(900450186894289455 3969543146641149120 1895649597198586619 827948490035658087 2279347887019741461), 0x4000000000000001) end def test_0x10000000000 ws = %w(455570294424 1073054410371 790795084744 2445173525 1088503892627) assert_random_int(ws, 0x10000000000, 3) end def test_0x10000 ws = %w(2732 43567 42613 52416 45891) assert_random_int(ws, 0x10000) end def test_types srand(0) rnd = Random.new(0) assert_equal(44, rand(100.0)) assert_equal(44, rnd.rand(100)) assert_equal(1245085576965981900420779258691, rand((2**100).to_f)) assert_equal(1245085576965981900420779258691, rnd.rand(2**100)) assert_equal(914679880601515615685077935113, rand(-(2**100).to_f)) srand(0) rnd = Random.new(0) assert_equal(997707939797331598305742933184, rand(2**100)) assert_equal(997707939797331598305742933184, rnd.rand(2**100)) assert_in_delta(0.602763376071644, rand((2**100).coerce(0).first), 0.000000000000001) assert_raise(ArgumentError) {rnd.rand((2**100).coerce(0).first)} srand(0) rnd = Random.new(0) assert_in_delta(0.548813503927325, rand(nil), 0.000000000000001) assert_in_delta(0.548813503927325, rnd.rand(), 0.000000000000001) srand(0) rnd = Random.new(0) o = Object.new def o.to_int; 100; end assert_equal(44, rand(o)) assert_equal(44, rnd.rand(o)) assert_equal(47, rand(o)) assert_equal(47, rnd.rand(o)) assert_equal(64, rand(o)) assert_equal(64, rnd.rand(o)) end def test_srand srand assert_kind_of(Integer, rand(2)) assert_kind_of(Integer, Random.new.rand(2)) srand(2**100) rnd = Random.new(2**100) %w(3258412053).each {|w| assert_equal(w.to_i, rand(0x100000000)) assert_equal(w.to_i, rnd.rand(0x100000000)) } end def test_shuffle srand(0) result = [*1..5].shuffle assert_equal([*1..5], result.sort) assert_equal(result, [*1..5].shuffle(random: Random.new(0))) end def test_big_seed assert_random_int(%w(2757555016), 0x100000000, 2**1000000-1) end def test_random_gc r = Random.new(0) %w(2357136044 2546248239 3071714933).each do |w| assert_equal(w.to_i, r.rand(0x100000000)) end GC.start %w(3626093760 2588848963 3684848379).each do |w| assert_equal(w.to_i, r.rand(0x100000000)) end end def test_random_type_error assert_raise(TypeError) { Random.new(Object.new) } assert_raise(TypeError) { Random.new(0).rand(Object.new) } end def test_random_argument_error r = Random.new(0) assert_raise(ArgumentError) { r.rand(0, 0) } assert_raise(ArgumentError, '[ruby-core:24677]') { r.rand(-1) } assert_raise(ArgumentError, '[ruby-core:24677]') { r.rand(-1.0) } assert_raise(ArgumentError, '[ruby-core:24677]') { r.rand(0) } assert_equal(0, r.rand(1), '[ruby-dev:39166]') assert_equal(0, r.rand(0...1), '[ruby-dev:39166]') assert_equal(0, r.rand(0..0), '[ruby-dev:39166]') assert_equal(0.0, r.rand(0.0..0.0), '[ruby-dev:39166]') assert_raise(ArgumentError, '[ruby-dev:39166]') { r.rand(0...0) } assert_raise(ArgumentError, '[ruby-dev:39166]') { r.rand(0..-1) } assert_raise(ArgumentError, '[ruby-dev:39166]') { r.rand(0.0...0.0) } assert_raise(ArgumentError, '[ruby-dev:39166]') { r.rand(0.0...-0.1) } bug3027 = '[ruby-core:29075]' assert_raise(ArgumentError, bug3027) { r.rand(nil) } end def test_random_seed assert_equal(0, Random.new(0).seed) assert_equal(0x100000000, Random.new(0x100000000).seed) assert_equal(2**100, Random.new(2**100).seed) end def test_random_dup r1 = Random.new(0) r2 = r1.dup %w(2357136044 2546248239 3071714933).each do |w| assert_equal(w.to_i, r1.rand(0x100000000)) end %w(2357136044 2546248239 3071714933).each do |w| assert_equal(w.to_i, r2.rand(0x100000000)) end r2 = r1.dup %w(3626093760 2588848963 3684848379).each do |w| assert_equal(w.to_i, r1.rand(0x100000000)) end %w(3626093760 2588848963 3684848379).each do |w| assert_equal(w.to_i, r2.rand(0x100000000)) end end def test_random_state state = <