我正在创建自定义验证码并且效果很好,但有时它会从$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]];
答案 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
$ran_box = mt_rand(0, $random_num_box-1);