我在PHP中创建一个随机数组,我的代码似乎没有输出一个真正的随机答案


I'm creating a random array in PHP and my code doesnt seem to output a truly random answer

我想构造一个包含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

获取数组大小并随机选择索引