我需要在一定范围内生成随机的唯一数字,我该怎么做?我可以通过生成随机数
generator: $arr = []; $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 中(我想要生成的数字)]
P粉6681466362023-10-16 18:17:22
$len = 10; // total number of numbers $min = 100; // minimum $max = 999; // maximum $range = []; // initialize array foreach (range(0, $len - 1) as $i) { while(in_array($num = mt_rand($min, $max), $range)); $range[] = $num; } print_r($range);
我很想知道已接受的答案与我的答案有何不同。值得注意的是,两者的混合可能是有利的;事实上,这是一个根据某些值有条件地使用其中一个的函数:
# The accepted answer function randRange1($min, $max, $count) { $numbers = range($min, $max); shuffle($numbers); return array_slice($numbers, 0, $count); } # My answer function randRange2($min, $max, $count) { $i = 0; $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 count 0.019910097122192 randRange2: small range, high count 1.5043621063232 randRange1: high range, small count 2.4722430706024 randRange2: high range, small count 0.0001051425933837
如果您使用较小的范围和较高的返回值数量,则接受的答案肯定是最佳的;然而,正如我所预期的那样,更大的范围和更小的计数将需要更长的时间来接受答案,因为它必须存储范围内的每个可能的值。您甚至冒着超出 PHP 内存上限的风险。评估范围和计数之间的比率并有条件地选择生成器的混合体将是两全其美的。
P粉1808446192023-10-16 11:11:30
具有随机顺序的数字范围的数组:
$numbers = range(1, 20); shuffle($numbers);
封装函数:
function UniqueRandomNumbersWithinRange($min, $max, $quantity) { $numbers = range($min, $max); shuffle($numbers); return array_slice($numbers, 0, $quantity); }
示例:
<?php print_r( UniqueRandomNumbersWithinRange(0,25,5) ); ?>
结果:
Array ( [0] => 14 [1] => 16 [2] => 17 [3] => 20 [4] => 1 )