[英]PHP - get random integer using random_int() without repeating and looping
我需要在不重復的情況下獲得 50 個超出 1-100 范圍的隨機數。 我目前的做法是:
$array = array();
while (count($array) <= 50) {
$temp = random_int(1,100);
if (!in_array($temp, $array))
$array[] = $temp;
}
但是,循環太多了,因為我需要生成超過 100,000 次。 有沒有其他方法可以在不循環的情況下獲得 50 個隨機非重復數字?
例如:
$number= range(1,100);
$array = array_slice(shuffle($number),0,50);
我不能使用shuffle
,因為它使用偽隨機數。
有沒有其他方法可以實現我的需要,或者可以縮短時間的方法。
預先填寫一組數字並從中挑選,然后將其刪除。 它可以防止您擁有不必要的隨機生成
$numbers = [];
for ($i = 1; $i <= 100; $i++) {
$numbers[] = $i;
}
$randomNumbers = [];
for ($i = 1; $i <= 50; $i++) {
$r = rand(0, count($numbers) - 1);
$randomNumbers[] = $numbers[$r];
array_splice($numbers, $r, 1);
}
這將是我的方法:
在任何情況下,這都會為您提供 50 個數字,而且它們彼此之間肯定是不同的。 加:你不必預先填充一些其他數組:
$start = microtime(true);
for($i = 0; $i <= 100000; $i++){
$arr = [];
while(sizeof($arr) < 50){
$num = rand(1, 100);
$arr[$num] = $num;
}
if(array_unique($arr) !== $arr || sizeof($arr) !== 50 ){
print("FAIL");
}
//print(array_unique($arr) == $arr ? "true" : "false");print("<br>");
//print(sizeof($arr));print("<br>");
//print_r(array_count_values ($arr));print("<br>");
//print_r($arr);print("<br>");
}
$time_elapsed_secs = microtime(true) - $start;
print($time_elapsed_secs);print("<br>");
運行這 100000 次對我來說大約需要 0.4 秒。
實際的生成在這部分完成:
$arr = [];
while(sizeof($arr) < 50){
$num = rand(1, 100);
$arr[$num] = $num;
}
我們可以分兩步做:
$x = 0;
$arr = [];
while($x < 50){
$tmp = rand(1, 100);
if(!in_array($tmp, $arr)){
$arr[] = $tmp;
$x++;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.