php中的伪随机数

php中的伪随机数,php,random,Php,Random,我有一个函数,根据随机数以不同的顺序输出项目。例如,大力水手的1/2时间和它的标志将在名单上排名第一,塔可钟和它的标志将是2/2时间,反之亦然 问题在于,当用户重新加载或返回页面时,顺序被重新随机分配$这里的Range是数据库中的项数,所以它使用的是介于1和$Range之间的随机数 $random = mt_rand(1,$range); for ($i = 0 ; $i < count($variants); $i++) { $random -= $variants[$i

我有一个函数,根据随机数以不同的顺序输出项目。例如,大力水手的1/2时间和它的标志将在名单上排名第一,塔可钟和它的标志将是2/2时间,反之亦然

问题在于,当用户重新加载或返回页面时,顺序被重新随机分配$这里的Range是数据库中的项数,所以它使用的是介于1和$Range之间的随机数

  $random = mt_rand(1,$range);
  for ($i = 0 ; $i < count($variants); $i++) {
    $random -= $variants[$i]['weight'];
    if ($random <= 0) {
      $chosenoffers[$tag] = $variants[$i];
      break;
    }
  }

我的想法是,我可以用某种伪随机生成器替换函数中的mt_rand,该生成器在整个会话中使用相同的1-100随机数作为种子。这样我就不必重写所有已经编写的代码。我是找错人了还是这是个好主意?

回答这个问题:视情况而定。这是一种方法*

但请注意:。PHP mt_rand是一个Mersenne Twister,它是一个PRNG(已经)并具有种子函数


*但是,如果支持源发生更改,则仍然是错误的。哎呀:-/

回答这个问题:这要看情况而定。这是一种方法*

但请注意:。PHP mt_rand是一个Mersenne Twister,它是一个PRNG(已经)并具有种子函数


*但是,如果支持源发生更改,则仍然是错误的。哎呀:-/

这份工作应该做的是:

<?php
srand(1);
echo rand();
// 1804289383
srand(1);
echo rand();
// 1804289383
?>

或各自

<?php
mt_srand(1);
echo mt_rand(1, 100);
//58
mt_srand(1);
echo mt_rand(1, 100);
//58
?>


如您所说,在会话中保存种子作业应该:

<?php
srand(1);
echo rand();
// 1804289383
srand(1);
echo rand();
// 1804289383
?>

或各自

<?php
mt_srand(1);
echo mt_rand(1, 100);
//58
mt_srand(1);
echo mt_rand(1, 100);
//58
?>


就像你说的那样,在会话中保存种子

为什么不直接使用array\u shuffle?为什么不直接使用array\u shuffle?我非常感谢你的建议。很有魅力。哦,一个问题。在我的网站的其他地方,各种wordpress插件中都有对mt_rand的其他引用。如果有其他使用mt_rand的实例呢?例如,akismet(wordpress插件)也使用mt_rand。有没有办法只为特定的mt_-rand实例设置种子?没有,您只能为后续的每个mt_-rand调用设置种子。但这不应该是个问题。我猜有人可以在重要的地方精心设计一个案子。如果您真的(真的)需要确保在代码之后获得真正的随机,那么您需要再次从真正的随机源(如/dev/random)重新设定种子。很抱歉这么晚才回复似乎不再有效:但我在这里找到了一些我还没有尝试的代码:我真的很感谢你的建议。很有魅力。哦,一个问题。在我的网站的其他地方,各种wordpress插件中都有对mt_rand的其他引用。如果有其他使用mt_rand的实例呢?例如,akismet(wordpress插件)也使用mt_rand。有没有办法只为特定的mt_-rand实例设置种子?没有,您只能为后续的每个mt_-rand调用设置种子。但这不应该是个问题。我猜有人可以在重要的地方精心设计一个案子。如果您真的(真的)需要确保在代码之后获得真正的随机,那么您需要再次从真正的随机源(如/dev/random)重新设定种子。很抱歉这么晚才回复似乎不起作用了:但我在这里找到了一些代码,我还没有尝试:你回答的问题也很好,事实上我使用了两个答案,但edorian先回答了。你回答的问题也很好,事实上我使用了两个答案,但edorian先回答了。