php中的伪随机数

时间:2010-04-15 00:58:36

标签: php random

我有一个函数可以根据随机数以不同的顺序输出项目。例如,大部分时间Popeye和它将在列表中排名第一,而Taco Bell及其标志将是#2和一半的时间\它将是另一种方式。

问题是当用户重新加载或返回页面时,订单会重新随机化。 $ Range这里是db中的项目数,因此它使用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;
    }
  }

我去了会话的开头并设置了这个:

if (!isset($_SESSION['rannum'])){
    $_SESSION['rannum']=rand(1,100);
    }

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

2 个答案:

答案 0 :(得分:3)

工作应该是:

<?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
?>

并像你说的那样将种子保存在会话中

答案 1 :(得分:1)

回答这个问题:这取决于。这是一种方法*。

但请查看:http://www.php.net/manual/en/function.mt-srand.php。 PHP mt_rand是一个Mersenne Twister,它是一个PRNG(已经)并具有种子功能。

*但是,如果支持源发生变化,你仍然错了。糟糕: - /