假设我打电话srand(1234)
,然后调用rand()
反复。无论我的环境如何,我都能保证获得相同的随机数序列吗?
例如,
- 红宝石 1.8.7 vs 1.9.3 vs 2.0
- MRI 与 JRuby
- Windows、Mac、Linux
根据我的经验,答案是“是”
我在测试新宝石时会做同样的事情。该 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 https://travis-ci.org/neilslater/games_dice),我测试了所有这些:
- "1.8.7"
- "1.9.3"
- "2.0.0"
- jruby-18mode # 1.8 模式下的 JRuby
- jruby-19mode # 1.9 模式下的 JRuby
- rbx-18模式
- rbx-19模式
最后两个我什至不知道它们是什么:-)
测试套件从未因 Ruby 的意外数字而失败rand
method.
Ruby 中的底层机制称为 Mersenne Twisterhttp://en.wikipedia.org/wiki/Mersenne_twister http://en.wikipedia.org/wiki/Mersenne_twister这将从相同的种子生成相同的值,即使是在实现它的不同语言中也是如此。据我所知,这个算法是Ruby使用的算法rand()
(and srand()
)在所有标准实现中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)