简体   繁体   中英

PHP - get random integer using random_int() without repeating and looping

I need to get 50 random numbers out of range 1-100 without repeating. The current way i do is:

$array = array();
while (count($array) <= 50) {
  $temp = random_int(1,100);
  if (!in_array($temp, $array))
    $array[] = $temp;
}

However, the looping is too many because I need to generate for more than 100,000 times. Is there other ways that I can get a 50 random non-repeating numbers without looping?

For example:

$number= range(1,100);
$array = array_slice(shuffle($number),0,50);

I can't use shuffle because it uses pseudo random number.

Is there other ways to achieve what I need, or ways that could shorten time.

pre fill a array of numbers and pick from them, and then remove it. it prevents the unnecessary random generations you have

$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);
}

This would be my approach:

This gives you 50 numbers in any case, and they are defenitely different from each other. PLUS: you dont have to prefill some other array:

$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>");

Running this 100000 times takes about 0.4sec for me.

The actual generation is done in this part:

$arr = [];
  while(sizeof($arr) < 50){
          $num = rand(1, 100);
          $arr[$num] = $num;
  }

We can do in 2 steps:

$x = 0;
$arr = [];
while($x < 50){
    $tmp = rand(1, 100);
    if(!in_array($tmp, $arr)){
        $arr[] = $tmp;
        $x++;
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM