生成范围内的唯一随机数 - PHP

生成范围内的唯一随机数 - PHP

我需要在一个范围内生成随机的UNIQUE数字吗?怎么做 ?

我可以生成随机数

generator:$arr=array();$x=rand($min,$max);$len=count($arr);$flag = 0;for($i=0;$i<$len;$i++){
 if ($flag == 1)
   goto generator;
 if ($x == $arr[$i])
   $flag = 1;}$arr[$index] = $x;$index++; goto generator;

我知道这段代码很糟糕,所以我需要一个更好的我的版本优化代码!救命 !

例如:如果我需要在1到15之间生成3个数字,它们应该是5,9,1但不是3,1,2 [在1-3中(我想要生成的数字)]


狐的传说
浏览 734回答 3
3回答

Helenr

$len = 10;&nbsp; &nbsp;// total number of numbers$min = 100;&nbsp; // minimum$max = 999;&nbsp; // maximum$range = []; // initialize arrayforeach (range(0, $len - 1) as $i) {&nbsp; &nbsp; while(in_array($num = mt_rand($min, $max), $range));&nbsp; &nbsp; $range[] = $num;}print_r($range);我很想知道接受的答案是如何与我的一致的。值得注意的是,两者的混合可能是有利的; 实际上是一个根据特定值有条件地使用一个或另一个的函数:# The accepted answerfunction randRange1($min, $max, $count){&nbsp; &nbsp; $numbers = range($min, $max);&nbsp; &nbsp; shuffle($numbers);&nbsp; &nbsp; return array_slice($numbers, 0, $count);}# My answerfunction randRange2($min, $max, $count){&nbsp; &nbsp; $range = array();&nbsp; &nbsp; while ($i++ < $count) {&nbsp; &nbsp; &nbsp; &nbsp; while(in_array($num = mt_rand($min, $max), $range));&nbsp; &nbsp; &nbsp; &nbsp; $range[] = $num;&nbsp; &nbsp; }&nbsp; &nbsp; 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内存上限的风险。混合物评估范围和计数之间的比率,并有条件地选择发电机将是两个世界中最好的。
打开App,查看更多内容
随时随地看视频慕课网APP