我试图在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>");
}
谁能告诉我哪里出错?
答案 0 :(得分:7)
像这样(根据我最初的评论),
$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() - 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, ...]
。[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)
永远不会返回boolan 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
希望它可以帮到你,记得在盒子外思考。