PHP的mt_rand()函数只返回2^31个不同的随机数.它是如何改变正常的梅森龙卷风的


The mt_rand() function of PHP returns only 2^31 different random numbers. How does it modify the normal Mersenne twister?

我用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的源代码进行比较,并验证它们没有差异。