PHP:多个唯一的随机整数在特定范围内

问题描述:

我想创建8个随机整数,这是独一无二的,在范围介于0和99PHP:多个唯一的随机整数在特定范围内

有一个整齐的解决方案,比我想的一个?

<?php 


do { 

    $rnd1 = rand(0,99); 
    $rnd2 = rand(0,99); 
    $rnd3 = rand(0,99); 
    $rnd4 = rand(0,99); 
    $rnd5 = rand(0,99); 
    $rnd6 = rand(0,99); 

} while (($rnd1 == $rnd2) || 
     ($rnd1 == $rnd3) || 
     ($rnd1 == $rnd4) || 
     ($rnd1 == $rnd5) || 
     ($rnd1 == $rnd6) || 
     ($rnd2 == $rnd3) || 
     ($rnd2 == $rnd4) || 
     ($rnd2 == $rnd5) || 
     ($rnd2 == $rnd6) || 
     ($rnd3 == $rnd4) || 
     ($rnd3 == $rnd5) || 
     ($rnd3 == $rnd6) || 
     ($rnd4 == $rnd5) || 
     ($rnd4 == $rnd6) || 
     ($rnd5 == $rnd6) ); 


?> 
+0

'$范围=范围(0,99);洗牌($范围内); $ rand_ints = array_slice($ range,0,8);' – Phylogenesis

尝试下面的代码。
它将创建一个包含0到99之间的8个随机值的数组,同时检查它们是否已被添加以确保它们是唯一的。

$numbers = array(); 
while (count($numbers) <= 8) { 
    $x = mt_rand(0,99); 
    if (!in_array($x,$numbers)) { 
     $numbers[] = $x; 
    } 
} 
print_r($numbers); 

也看到这两个Q & A的有关使用mt_randrand
Difference between mt_rand() and rand()
What's the disadvantage of mt_rand?

+1

另请注意,我们有['random_int'](http://php.net/manual/en/function.random-int.php) – PeeHaa

+0

好点@ PeeHaa虽然这将在PHP 7中可用 –

+1

我的解决方案比每次生成一个数字时都用'in_array'检查更快。 –

$rnds = []; 

do { 
    $newRnd = rand(0, 99); 
    $rnds[] = $newRnd; 
} while(in_array($newRnd, $rnds) && count($rnds) < 9); 

print_r($rnds); 
+0

如果有重复,这只会做(do while)循环的另一个迭代,而不是实际上删除/覆盖它。用'5'存根'rand',你会看到我是正确的。 –

这是依赖于数组索引优化版本。这个解决方案的复杂性是线性的,而不像@ AlexAndrei的回答中那样。它依靠使用数组索引作为保证没有重复,所以不需要添加in_array的开销。

$random_numbers = []; 

do { 
    $rand = rand(0, 99); 
    $random_numbers[$rand] = $rand; 
} while(count($random_numbers) < 9); 

$random_numbers = array_values($random_numbers); // This strips the keys 

print_r($random_numbers); 

如果您使用的是foreach你甚至可以删除array_values调用,它也将提高代码的速度,但在数组中的号码将是以下形式:[ a => a, b => b, ... ]

+0

尽管你可以使用'mt_rand()'而不是'rand()',这应该由于mt_rand()更高的熵而在理论上加快了平均生成过程。 –