我想构造一个包含3个报价的数组,这些报价以随机顺序输出。我有下面的代码,虽然它输出3个随机提供它似乎不是随机的。生成的数组中的第一个值似乎总是来自我的报价表中的前2条记录。报价表中只有5条记录(我不知道这是否影响了事情)。
$arrayOfferCount = $offerCount-1;
$displayThisManyOffers = 3;
$range = range(0, $arrayOfferCount);
$vals = array_rand($range, $displayThisManyOffers);`
工作正常。通过多次测试测试,而不是仅仅凭直觉……这里是1000次尝试:
<?php
$offerCount = 5;
$arrayOfferCount = $offerCount-1;
$displayThisManyOffers = 3;
$range = range(0, $arrayOfferCount);
for($i = 0; $i < 1000; $i++) {
$vals = array_rand($range, $displayThisManyOffers);
foreach($vals as $val) {
$counts[$val]++;
}
}
sort($counts);
print_r($counts);
生成:
Array
(
[0] => 583
[1] => 591
[2] => 591
[3] => 610
[4] => 625
)
我知道mt_rand()是更好的PRNG。
但是,在您的情况下,您需要让数据库为您选择它们
SELECT * FROM ads ORDER BY RAND() LIMIT 0, 3
它可能是随机选择要显示的,但以它们在数组中出现的顺序显示它们。如果你做了足够多的次数(~20次),你应该会让第三个选项出现一次(在5个选项中选择最后3个的概率是1/5*4,所以大约每20次你就会看到第三个选项出现)。
array_rand有时似乎不能正常工作(参见PHP-Manual注释)。
解决方法:使用函数mt_rand