PHP-使用random_int()获取随机整数,无需重复和循环
我需要在不重复的情况下从1-100范围内随机抽取50个数字。我目前的做法是: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,因为它使用伪随机数 是否有其他方法可以满足我的需要,或者可以缩短时间。预先填充一个数字数组,从中选择,然后删除它。 它可以
$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个元素。