使用PHP中的数组无需重复的随机数

use*_*066 0 php random

我正在尝试用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>");
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我哪里出错了?

Art*_*nix 7

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

$array = [];

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

print_r( $array );
Run Code Online (Sandbox Code Playgroud)

通过将"key"设置为随机数,我们可以滥用关联数组键是唯一的这一事实.然后,只需等待数组包含所需数量的唯一项即可.

你可以在这里测试一下

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

Array
(
    [16] => 16
    [20] => 20
    [27] => 27
)
Run Code Online (Sandbox Code Playgroud)

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

$a = range(1,36);

shuffle($a);

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

print_r($array);
Run Code Online (Sandbox Code Playgroud)

当您必须找到的项目数量更高时,这将有更好的性能.这是因为没有重复,没有碰撞.因此,如果你有一个小范围,但需要为返回找到很多项目,这将更好地预成型.如果你有很多项目并且只需要返回很少的项目,那么第一项可能会更好,如果不是从速度到内存使用.

你可以在这里看到它

供参考使用

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

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

shuffle() - Shuffles(随机化元素的顺序)数组.它使用不适合加密目的的伪随机数生成器.

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;
Run Code Online (Sandbox Code Playgroud)

因为mt_rand(1,36)永远不会归还boolan false.另外,如果我记得mt_randrand现在一样,或者至少在当前的PHP版本中.

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

希望它可以帮到你,记得在盒子外思考.