我用java实现了Mersenne twister,它可以在闭区间[Integer.MIN_VALUE,Integer.MAX_VALUE]
中生成32位均匀分布的随机数。
当我在PHP
中调用mt_rand()
时,它可以在这个封闭区间生成32 bit
均匀分布的随机数:[0, Integer.MAX_VALUE]
。这个间隔只是一半!它仍然是均匀分布的,所以它很适合生成随机数。但是,如果我的实现和mt_rand()
使用相同的种子,我会得到不同的结果。
示例一:
mt_srand:=1000
mt_rand()
myseed:=1000
myrand()
mt_rand
返回:753084335
myrand()
返回:-1712525729
示例二:(使用不同种子)
mt_srand:=10000
mt_rand()
myseed:=10000
myrand()
mt_rand
返回:983171632
myrand()
返回:418336623
如果我使用相同的种子,我应该怎么做才能获得相同的值?
是什么让你认为可以得到相同的随机数序列?
要获得相同的序列,您需要使用相同的生成器算法,直到最后一个细节。其中一个细节是输出的范围。
获得相同输出的最简单方法是将实现更改为简单地调用mt_rand
。
另一种方法是将您的源代码和PHP使用的mt_rand
的源代码进行比较,并验证它们没有差异。