Rumah > Soal Jawab > teks badan
Saya perlu menjana nombor unik rawak dalam julat tertentu, bagaimana saya boleh melakukannya? Saya boleh menjana nombor rawak dengan
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;
Saya tahu kod ini teruk, jadi saya perlu menjadikan versi saya kod dioptimumkan dengan lebih baik! tolong!
Contoh: Jika saya perlu menjana 3 nombor antara 1 dan 15, ia sepatutnya seperti 5, 9, 1, tetapi bukan 3, 1, 2 [dalam 1 - 3 (nombor yang saya ingin hasilkan)]
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);
Saya ingin tahu bagaimana jawapan yang diterima berbeza daripada jawapan saya. Perlu diingat bahawa campuran kedua-duanya boleh memberi kelebihan; sebenarnya, berikut ialah fungsi yang menggunakan satu atau yang lain secara bersyarat berdasarkan nilai tertentu:
# 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;
Hasil:
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
Jawapan yang diterima pastinya optimum jika anda menggunakan julat yang lebih kecil dan bilangan nilai pulangan yang lebih tinggi walau bagaimanapun, seperti yang saya jangkakan, julat yang lebih besar dan kiraan yang lebih kecil akan mengambil masa yang lebih lama Untuk mendapatkan jawapan yang diterima, ia perlu menyimpan setiap nilai yang mungkin dalam julat. Anda juga menghadapi risiko melebihi had memori PHP. Menilai nisbah antara julat dan kiraan dan memilih hibrid penjana secara bersyarat akan menjadi yang terbaik daripada kedua-dua dunia.
P粉1808446192023-10-16 11:11:30
Tatasusunan dengan julat nombor dalam susunan rawak:
$numbers = range(1, 20); shuffle($numbers);
Fungsi pembungkusan:
function UniqueRandomNumbersWithinRange($min, $max, $quantity) { $numbers = range($min, $max); shuffle($numbers); return array_slice($numbers, 0, $quantity); }
Contoh:
<?php print_r( UniqueRandomNumbersWithinRange(0,25,5) ); ?>
Hasil:
Array ( [0] => 14 [1] => 16 [2] => 17 [3] => 20 [4] => 1 )