PHP-使用random_int()获取随机整数,无需重复和循环

PHP-使用random_int()获取随机整数,无需重复和循环,php,Php,我需要在不重复的情况下从1-100范围内随机抽取50个数字。我目前的做法是: $array = array(); while (count($array) <= 50) { $temp = random_int(1,100); if (!in_array($temp, $array)) $array[] = $temp; } 我不能使用shuffle,因为它使用伪随机数 是否有其他方法可以满足我的需要,或者可以缩短时间。预先填充一个数字数组,从中选择,然后删除它。 它可以

我需要在不重复的情况下从1-100范围内随机抽取50个数字。我目前的做法是:

$array = array();
while (count($array) <= 50) {
  $temp = random_int(1,100);
  if (!in_array($temp, $array))
    $array[] = $temp;
}
我不能使用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);
}
$numbers=[];

对于($i=1;$i预先填充一个数字数组并从中选取,然后将其删除。 它可以防止不必要的随机生成

$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);
}
$numbers=[];
对于($i=1;$i我们可以分两步进行:

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

}
$x=0;
$arr=[];
而($x<50){
$tmp=兰特(1100);
if(!in_数组($tmp,$arr)){
$arr[]=$tmp;
$x++;
}
}
我们可以通过两个步骤完成:

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

}
$x=0;
$arr=[];
而($x<50){
$tmp=兰特(1100);
if(!in_数组($tmp,$arr)){
$arr[]=$tmp;
$x++;
}
}

这是我的方法:

这在任何情况下都会为您提供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>");
$start=microtime(真);

对于($i=0;$i这将是我的方法:

这在任何情况下都会为您提供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>");
$start=microtime(真);


对于($i=0;$i这是否回答了您的问题?@Banzay这个答案也使用了
for
循环,我试图避免使用循环@Banzay这个@Banzay中有几个答案引用的问题使用Java,但是这个问题是关于PHP的,所以代码会有所不同。@Martin ok。对不起。没有注意到。重新打包关闭。这是否回答了您的问题estion?@Banzay答案也使用
for
循环,我试图避免使用循环在@Banzay中有几个答案引用的问题使用Java,但是这个问题是关于PHP的,所以代码会有所不同。@Martin ok。抱歉。没有注意到。重新打包关闭。它将给出50个随机数,每个数都是between(1到100)。不!它可以随机给你一个50乘以0的数组。(概率很低),但这是可能发生的。只要试着运行你的代码几次,你就会明白我的意思……它最终几乎不会返回大小为50的数组。我这样做了,并附上了屏幕截图。它工作正常,我测试了5次:)也许你想说些别的。运行这个$x=0;$arr=[];而($x)代码是一样的,在这里它显示49个索引意味着50个元素。它将给出50个随机数,每个数字将在(1到100)之间。不!它可以随机给你一个数组,其中包含50乘以0。(概率很低)但这是可能发生的。只要试着运行几次代码,你就会明白我的意思……它最终几乎不会返回大小为50的数组。我这样做了,并附上了屏幕截图。它工作正常,我测试了5次:)也许你想说些别的。运行这个$x=0;$arr=[];同时($x)代码在这里是一样的,很奇怪,它最多显示49个索引意味着50个元素。