【问题标题】:Pseudo random numbers in phpphp中的伪随机数
【发布时间】:2010-04-15 00:58:35
【问题描述】:

我有一个函数可以根据随机数以不同的顺序输出项目。例如,1/2 的时间 Popeye's 及其将在列表中排名第一,而 Taco Bell 及其徽标将排名第二,而一半的时间将是相反的情况。

问题是当用户重新加载或返回页面时,顺序会重新随机化。这里的 $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 随机数作为种子。这样我就不必重写所有已经编写的代码。我是在找错树还是这是个好主意?

【问题讨论】:

  • 为什么不直接使用array_shuffle?

标签: php random


【解决方案1】:

这份工作应该是:

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

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

【讨论】:

  • 我非常感谢您的建议。像魅力一样工作。
  • 哦,一个问题。在我的网站的其他地方,在各种 wordpress 插件中还有其他对 mt_rand 的引用。如果还有其他使用 mt_rand 的情况怎么办?例如 akismet(一个 wordpress 插件)也使用 mt_rand。有没有办法只为某些 mt_rand 实例设置种子?
  • 不,您只能为接下来的每个 mt_rand 调用播种。但这应该不是问题。我猜一个人可以制作一个重要的案例。如果您 really ( really ) 需要确保在您的代码之后获得真正的随机数,您需要再次从真正的随机源(如 /dev/random )重新播种。抱歉这么晚才回复
  • 似乎不再工作了:php.net/manual/en/function.srand.php#102636 但我在这里找到了一些我还没有尝试过的代码:sitepoint.com/php-random-number-generator
【解决方案2】:

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

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

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

【讨论】:

  • 你也很好地回答了这个问题,事实上我使用了两个答案,但是edorian首先回答了。
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多