种子是否在不同的Rubys中生成相同的随机序列?

时间:2013-04-12 14:42:17

标签: ruby random cross-platform

假设我拨打srand(1234),然后反复拨打rand()。无论我的环境如何,我都能保证获得相同的随机数序列吗?

例如,

  • Ruby 1.8.7 vs 1.9.3 vs 2.0
  • MRI vs JRuby
  • Windows vs Mac vs Linux

2 个答案:

答案 0 :(得分:3)

我的经验回答是“是”

在测试新宝石时,我做同样的事情。 gem还没有为实际使用做好准备,但是在很大程度上依赖于随机数,而且大多数测试都涉及事先运行Ruby的srand(),所以我得到了可预测的断言数。总而言之,每次运行测试套件时,我可能会测试由rand()生成的几百个小整数。

到目前为止,我已经测试过:

在Windows上:MRI 1.9.3

在Mac上:MRI 1.8.7,MRI 1.9.3和MRI 2.0.0

在Travis上(参见build https://travis-ci.org/neilslater/games_dice),我测试了所有这些:

  • “1.8.7”
  • “1.9.3”
  • “2.0.0”
  • jruby-18mode#JRuby in 1.8 mode
  • jruby-19mode#JRuby in 1.9 mode
  • RBX-18mode
  • RBX-19mode

最后两个我甚至都不知道它们是什么: - )

由于Ruby rand方法的意外数字,测试套件从未失败过。

Ruby中的底层机制称为Mersenne Twister http://en.wikipedia.org/wiki/Mersenne_twister,它将从相同的种子生成相同的值,甚至可以在不同语言中生成相同的值。据我所知,这个算法是Ruby的rand()(和srand())在所有标准实现中使用的算法。

答案 1 :(得分:2)

嗯,这就是我在我的内心中得到的结果 - 它与你的内容相匹配吗?如果是这样,那么我认为你可以放心地说“是”。

顺便说一句,这就是播种的重点,所以我希望答案肯定是“是”,如果不是,我会感到惊讶。

ruby 1.9.3p327 (2012-11-10) [x86_64-darwin12.2.0]

irb(main):001:0> srand(1234)
=> 312936473923896776645464224839555650313
irb(main):002:0> rand
=> 0.1915194503788923
irb(main):003:0> rand
=> 0.6221087710398319
irb(main):004:0> rand
=> 0.4377277390071145
irb(main):006:0> rand
=> 0.7853585837137692
irb(main):007:0> rand
=> 0.7799758081188035