自定义验证码显示错误的数字

时间:2013-04-16 02:39:56

标签: php

我正在创建自定义验证码并且效果很好,但有时它会从$rand_keys中选择一个大于显示的框数的随机数。我该如何解决这个问题?

$color = array("red", "blue", "yellow", "white", "green", "purple", "brown", "orange", "pink", "black");
$random_num_box = mt_rand(3,8);

$numbers=array(0,1,2,3,4,5,6,7,8,9);

$rand_keys = array_rand($numbers, $random_num_box);
$ran_box =  mt_rand(0, $random_num_box);

echo "Random number of boxes:  ".$random_num_box."<br /><br />";
echo "<div>";
foreach ($rand_keys as $k=>$v) {
    echo "<div style='width: 20px; height: 20px; border: 1px solid #dcdcdc; margin-right: 2px; display: inline-block; background: ".$color[$numbers[$v]].";'></div>";
}
echo "</div>";

echo "<br />What is the color of box # ". ($ran_box + 1) ."?";
echo "<br />Answer:  ".$color[$rand_keys[$ran_box]];

2 个答案:

答案 0 :(得分:3)

问题是偶尔会有一个随机选取的数字大于显示的方框数量。这似乎源于以下两行:

$rand_keys = array_rand($numbers, $random_num_box);
$ran_box =  mt_rand(0, $random_num_box);

由于这很难模拟,因为它是随机的,最简单的方法是找出一个证明它不起作用的例子。

从研究中,您会发现array_rand将采用数组并根据第二个参数随机选择项目数量,在本例中为$random_num_box。所以我们有以下数组:

array(
 [0] => 1,
 [1] => 2,
 [2] => 3
)

现在我们继续得到随机答案($ran_box)。参数将是(对于此示例)$random_num_box = 3;因此运行的命令是

$ran_box =  mt_rand(0, 3);

您将获得0到3之间的值(包括)。由于您的数组的大小仅为3(0-> 2),因此当您的随机数为3(或$random_num_box)时,您将收到错误消息。这是由于尝试访问不存在的array[3]

要解决此问题,您必须减少最大值1。

$rand_keys = array_rand($numbers, $random_num_box);
$ran_box =  mt_rand(0, $random_num_box - 1);

答案 1 :(得分:1)

我认为你只需要从$ran_box

中减去1
$ran_box =  mt_rand(0, $random_num_box-1);