1

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

例如,

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

2 回答 2

4

根据我的经验,答案是“是”

在测试新宝石时,我会做同样的事情。gem 尚未准备好用于实际使用,但严重依赖随机数,并且大多数测试都涉及预先运行 Ruby 的 srand() ,因此我得到了可预测的断言数。总而言之,我可能会在每次运行测试套件时测试由 rand() 生成的几百个小整数。

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

在 Windows 上:MRI 1.9.3

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

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

  • “1.8.7”
  • “1.9.3”
  • “2.0.0”
  • jruby-18mode # JRuby 1.8 模式
  • jruby-19mode # JRuby 1.9 模式
  • rbx-18模式
  • rbx-19模式

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

测试套件从未因 Rubyrand方法中的意外数字而失败。

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

于 2013-04-12T15:40:09.547 回答
2

好吧,这就是我在我的 irb 中得到的——它与你在你的 irb 中得到的相符吗?如果是这样,那么我认为您可以放心地说“是”。

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

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
于 2013-04-12T14:47:09.863 回答