Helenr
$len = 10; // total number of numbers$min = 100; // minimum$max = 999; // maximum$range = []; // initialize arrayforeach (range(0, $len - 1) as $i) { while(in_array($num = mt_rand($min, $max), $range)); $range[] = $num;}print_r($range);我很想知道接受的答案是如何与我的一致的。值得注意的是,两者的混合可能是有利的; 实际上是一个根据特定值有条件地使用一个或另一个的函数:# The accepted answerfunction randRange1($min, $max, $count){ $numbers = range($min, $max); shuffle($numbers); return array_slice($numbers, 0, $count);}# My answerfunction randRange2($min, $max, $count){ $range = array(); while ($i++ < $count) { while(in_array($num = mt_rand($min, $max), $range)); $range[] = $num; } return $range;}echo 'randRange1: small range, high count' . PHP_EOL;$time = microtime(true);randRange1(0, 9999, 5000);echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;echo 'randRange2: small range, high count' . PHP_EOL;$time = microtime(true);randRange2(0, 9999, 5000);echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;echo 'randRange1: high range, small count' . PHP_EOL;$time = microtime(true);randRange1(0, 999999, 6);echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;echo 'randRange2: high range, small count' . PHP_EOL;$time = microtime(true);randRange2(0, 999999, 6);echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;结果:randRange1: small range, high count0.019910097122192randRange2: small range, high count1.5043621063232randRange1: high range, small count2.4722430706024randRange2: high range, small count0.0001051425933837如果您使用较小的范围和较高的返回值计数,则接受的答案肯定是最佳的; 然而正如我所预料的那样,更大的范围和更小的计数将在接受的答案中花费更长的时间,因为它必须存储范围内的每个可能的值。你甚至冒着吹PHP内存上限的风险。混合物评估范围和计数之间的比率,并有条件地选择发电机将是两个世界中最好的。