Heim > Fragen und Antworten > Hauptteil
Ich muss zufällige, eindeutige Zahlen innerhalb eines bestimmten Bereichs generieren. Wie kann ich das tun? Ich kann Zufallszahlen generieren mit
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;
Ich weiß, dass dieser Code schrecklich ist, deshalb muss ich meine Version besser optimieren! helfen!
Beispiel: Wenn ich 3 Zahlen zwischen 1 und 15 generieren muss, sollten sie wie 5, 9, 1 sein, aber nicht 3, 1, 2 [in 1 - 3 (die Zahlen, die ich generieren möchte)]
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 )