我想创建8个随机整数,它们是唯一的,范围在0到99之间。
有没有比我想到的更简洁的解决方案?
<?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) );
?>
试试下面的代码。
它将创建一个包含8个0到99之间的随机值的数组,同时检查它们是否已经被添加,以确保它们在整个数组中是唯一的。
$numbers = array();
while ( count($numbers) <= 8 ) {
$x = mt_rand(0,99);
if ( !in_array($x,$numbers) ) {
$numbers[] = $x;
}
}
print_r($numbers);
也请参阅这两个关于使用mt_rand
和rand
的问题
mt_rand()与rand()的区别
mt_rand的缺点是什么?
这是一个依赖于数组索引的优化版本。这个解决方案的复杂性是线性的,而不是@AlexAndrei的答案中的n2。它依赖于使用数组索引作为没有重复的保证,所以不需要增加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, ... ]
$rnds = [];
do {
$newRnd = rand(0, 99);
$rnds[] = $newRnd;
} while(in_array($newRnd, $rnds) && count($rnds) < 9);
print_r($rnds);