1

1) 在 PHP 中当我使用原生 php MT 实现时

mt_srand(1); 
var_dump(mt_rand());
var_dump(mt_rand());
var_dump(mt_rand());

我得到价值观

1244335972
15217923
1546885062

2)在这个 Mersenne Twister 实现 http://kingfisher.nfshost.com/sw/twister/
我运行

$twister = new twister(1);
var_dump($twister->int31());
var_dump($twister->int31());
var_dump($twister->int31());

并得到

1791095845
2135392491
946286476

3)在 JS 我使用
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/JAVASCRIPT/java-script.html

m = new MersenneTwister(1)
m.genrand_int31()
m.genrand_int31()
m.genrand_int31()

并得到

895547922
2141438069
1546885062

怎么会发生?

实际上,这在 JS

m = new MersenneTwister(1)
m.genrand_int32()
1791095845

这在 PHP

$twister = new twister(1);
var_dump($twister->int32());

返回相同的值 1791095845,但仅适用于第一次调用。

4

1 回答 1

4

Mersenne twister 是一PRNG,而不是单一算法。算法中使用的梅森素数可能会有所不同,不同的素数会对相同的种子产生不同的结果。

于 2013-04-15T17:50:14.610 回答