我有一个函数可以根据随机数以不同的顺序输出项目。例如,大部分时间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随机数作为种子。这样我就不必重写已编写的所有代码。我是在叫错树还是这个好主意?
答案 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(已经)并具有种子功能。
*但是,如果支持源发生变化,你仍然错了。糟糕: - /