【问题标题】:Random Numbers without duplication using an array in PHP在 PHP 中使用数组不重复的随机数
【发布时间】:2017-12-19 23:30:33
【问题描述】:

我正在尝试在 PHP 中创建一个随机数生成器。它应该一次生成三 (3) 个数字,无需重复。也就是说,3个数字不可能相同。

这是我迄今为止尝试过的:

$array = [];

$A = mt_rand(1,36);
$array[0] = $A;

$B = mt_rand(1,36);
$array[1] = $B;

if(in_array($B,$array)){
    $B = mt_rand(1,36);
    $array[1] = $B;
}

$C = mt_rand(1,36);
$array[2] = $C;

if(in_array($C,$array)){
    $C = mt_rand(1,36);
    $array[2] = $C;
}

$length = count($array);

//display the array values;

for($i = 0; $i < $length; $i++){
    echo ($array[$i]."<br>");
}

谁能告诉我哪里出错了?

【问题讨论】:

  • 我会使用一个循环,一个数组,将随机数放入数组键中,然后循环告诉它有 3 个项目。重复的密钥自然会被覆盖。
  • 问题是,您正在检查 $B$C 是否只有一次 in_array,但没有人保证您第二次不会再次获得相同的号码。
  • 在将数字放入数组后检查它是否在数组中没有多大意义。首先将 if 移到 in_array 之前。之后,您需要担心“猜测”重复两次或更多次。但一步一步。

标签: php random


【解决方案1】:

像这样(根据我最初的评论),

$array = [];

while( count($array) < 3 ){
    $rand = mt_rand(1,36);
    $array[$rand] = $rand;
}

print_r( $array );

通过将“key”设置为随机数,我们可以滥用关联数组键是唯一的这一事实。然后,等待数组包含所需数量的唯一项就很简单了。

你可以测试一下here

输出:(您的结果可能会有所不同,它是随机的)

Array
(
    [16] => 16
    [20] => 20
    [27] => 27
)

更新我试图想出一种不使用循环的有效方法(在我下班回家的路上),这种方法在某些情况下可能会更好。

$a = range(1,36);

shuffle($a);

$array = array_slice($a, 0, 3);

print_r($array);

当您必须找到的项目数量更多时,这将具有更好的性能。这是因为没有重复,没有冲突。因此,如果您的范围很小,但需要找到许多退货商品,这将更好地执行。如果您有很多物品并且只需要退回少量物品,那么第一个可能会更好,如果不是速度,那么内存使用。

你可以看到here

供参考使用

range() - 创建一个包含一系列元素的数组。

http://php.net/manual/en/function.range.php

shuffle() - 对数组进行随机播放(随机排列元素的顺序)。它使用不适合加密目的的伪随机数生成器。

http://php.net/manual/en/function.shuffle.php

array_slice() - 返回由 offset 和 length 参数指定的数组中的元素序列。

http://php.net/manual/en/function.array-slice.php

所以解释一下最后一个

  • 首先,我们创建一个数组,其中包含每个可能的数字作为一个元素。所以例如像这样[1,2,3,4,5,6, ...]
  • 接下来,我们将其随机化,从而随机化整个数组的顺序。 Shuffle 通过“引用”修改数组,因此它不会返回我们的数组,因此没有赋值(我认为它返回布尔值,但是我不知道它如何失败并返回 false,几乎只是返回 true ,我们不想用 ) 覆盖我们的数组。所以我们的例子就变成了[16,20,27,14,5,1, ...]
  • 最后我们减少了需要退回的商品数量。最后我们以 [16,20,27] 结束示例;

您可以通过在循环条件中分配$rand 变量的值来将第一个行压缩为一行(实际上是2)。像这样:

$array = [];

while( count($array) < 3 && false !== ($rand = mt_rand(1,36))) $array[$rand] = $rand;

因为mt_rand(1,36) 永远不会返回布尔值 false。另外,如果我记得 mt_rand 现在与 rand 相同,或者至少在当前 PHP 版本中是一样的。

注意:从 PHP 7.1.0 开始,rand() 使用与 mt_rand() 相同的随机数生成器。为了保持向后兼容性,rand() 允许 max 小于 min,而不是将 FALSE 作为 mt_rand() 返回。 http://php.net/manual/en/function.rand.php

希望对你有所帮助,记得跳出框框思考。

【讨论】:

  • 在我第一次认为它行不通之后,我意识到你使用随机值作为键 - 所以得到键结果。很好的解决方案!
  • 太棒了,如果我自己不这么说的话!如果你想清除“钥匙”做$array = array_values($array);
  • 拿着我的爆米花直到有人清除了while循环中的键。提示:不要;稍后再做。很好的答案!
  • 谢谢 bruh... 我将使用第一个选项。它更容易理解,我是这方面的新手。但是我仍然不知道如何将数组结果分配给这三个数字。协助?
  • 你是什么意思assign the array results to the the three numbers你会得到一个像这样Array ( [16] =&gt; 16 [20] =&gt; 20 [27] =&gt; 27 )的例子中的数组
猜你喜欢
  • 2017-09-22
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
相关资源
最近更新 更多