【问题标题】:PHP: Multiple Unique Random Integers In A Specific RangePHP:特定范围内的多个唯一随机整数
【发布时间】:2016-01-03 05:37:08
【问题描述】:

我想创建 8 个随机整数,它们是唯一的,范围在 0 到 99 之间。

有没有比我想的更简洁的解决方案?

<?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)    );


?>

【问题讨论】:

  • $range = range(0, 99); shuffle($range); $rand_ints = array_slice($range, 0, 8);

标签: php random unique


【解决方案1】:

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

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

另请参阅这两个关于使用mt_randrand 的问答
Difference between mt_rand() and rand()
What's the disadvantage of mt_rand?

【讨论】:

  • 还要注意我们有random_int
  • 我的解决方案比每次生成数字时检查in_array 更快。
【解决方案2】:

这是一个依赖于数组索引的优化版本。该解决方案的复杂性是线性的,而不是 @AlexAndrei 的回答中的 n2 。它依赖于使用数组索引来保证没有重复,因此不需要添加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 =&gt; a, b =&gt; b, ... ]

【讨论】:

  • 虽然您可以使用mt_rand() 而不是rand(),但由于mt_rand() 的熵较高,理论上这应该会加快平均生成过程。
【解决方案3】:
$rnds = [];

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

print_r($rnds);

【讨论】:

  • 如果有重复,这只会对 (do while) 循环进行另一次迭代,而不是实际删除/覆盖它。将rand5 存根,你会发现我是正确的。
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2011-08-02
  • 2012-04-13
  • 2018-06-22
  • 2011-02-02
  • 2010-12-04
相关资源
最近更新 更多