【问题标题】:Why I get different values from JS and PHP Mersenne Twister implementations?为什么我从 JS 和 PHP Mersenne Twister 实现中得到不同的值?
【发布时间】:2013-04-07 22:28:26
【问题描述】:

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,但仅限于第一次调用。

【问题讨论】:

  • 我错过了什么吗?您是在问为什么随机数生成器会生成随机数?
  • 啊,好吧,我确实错过了。哦。

标签: php javascript random mersenne-twister


【解决方案1】:

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

【讨论】:

  • 那么我怎样才能在客户端和服务器上为相同的给定种子获得相等的值?我应该自己实现 MT 算法吗?
  • 差不多。幸运的是,这并不难。
猜你喜欢
  • 2013-10-13
  • 2014-02-22
  • 1970-01-01
  • 2015-11-08
  • 2017-07-16
  • 1970-01-01
  • 2011-01-28
  • 2012-03-22
  • 2013-01-30
相关资源
最近更新 更多