PHP:多个唯一的随机整数在特定范围内
我想创建8个随机整数,这是独一无二的,在范围介于0和99PHP:多个唯一的随机整数在特定范围内
有一个整齐的解决方案,比我想的一个?
<?php
do {
$rnd1 = rand(0,99);
$rnd2 = rand(0,99);
$rnd3 = rand(0,99);
$rnd4 = rand(0,99);
$rnd5 = rand(0,99);
$rnd6 = rand(0,99);
} while (($rnd1 == $rnd2) ||
($rnd1 == $rnd3) ||
($rnd1 == $rnd4) ||
($rnd1 == $rnd5) ||
($rnd1 == $rnd6) ||
($rnd2 == $rnd3) ||
($rnd2 == $rnd4) ||
($rnd2 == $rnd5) ||
($rnd2 == $rnd6) ||
($rnd3 == $rnd4) ||
($rnd3 == $rnd5) ||
($rnd3 == $rnd6) ||
($rnd4 == $rnd5) ||
($rnd4 == $rnd6) ||
($rnd5 == $rnd6) );
?>
尝试下面的代码。
它将创建一个包含0到99之间的8个随机值的数组,同时检查它们是否已被添加以确保它们是唯一的。
$numbers = array();
while (count($numbers) <= 8) {
$x = mt_rand(0,99);
if (!in_array($x,$numbers)) {
$numbers[] = $x;
}
}
print_r($numbers);
也看到这两个Q & A的有关使用mt_rand
与rand
Difference between mt_rand() and rand()
What's the disadvantage of mt_rand?
另请注意,我们有['random_int'](http://php.net/manual/en/function.random-int.php) – PeeHaa
好点@ PeeHaa虽然这将在PHP 7中可用 –
我的解决方案比每次生成一个数字时都用'in_array'检查更快。 –
$rnds = [];
do {
$newRnd = rand(0, 99);
$rnds[] = $newRnd;
} while(in_array($newRnd, $rnds) && count($rnds) < 9);
print_r($rnds);
如果有重复,这只会做(do while)循环的另一个迭代,而不是实际上删除/覆盖它。用'5'存根'rand',你会看到我是正确的。 –
这是依赖于数组索引优化版本。这个解决方案的复杂性是线性的,而不像@ AlexAndrei的回答中那样。它依靠使用数组索引作为保证没有重复,所以不需要添加in_array
的开销。
$random_numbers = [];
do {
$rand = rand(0, 99);
$random_numbers[$rand] = $rand;
} while(count($random_numbers) < 9);
$random_numbers = array_values($random_numbers); // This strips the keys
print_r($random_numbers);
如果您使用的是foreach
你甚至可以删除array_values
调用,它也将提高代码的速度,但在数组中的号码将是以下形式:[ a => a, b => b, ... ]
尽管你可以使用'mt_rand()'而不是'rand()',这应该由于mt_rand()更高的熵而在理论上加快了平均生成过程。 –
'$范围=范围(0,99);洗牌($范围内); $ rand_ints = array_slice($ range,0,8);' – Phylogenesis