PHP rand生成零,即使范围应该是2到36?

时间:2011-05-09 12:45:37

标签: php captcha

for ($i = 1; $i <= $numITER; $i++) {
    $val = rand(2,36);

    switch (TRUE) {
        case ($val<=10):
            $vercodeTEMP.=$val;
            break;
        case ($val>10):
            if ($val != 25 && $val != 19) {
                $vercodeTEMP.=chr(54+$val);
            } else {
                $i=$i-1;
            }
            break;
    }
}

我基本上试图避免使用0,1和字母O和I.当兰特范围是2到36时,这怎么可能给我零?

2 个答案:

答案 0 :(得分:2)

如果$ val == 10,那么你将$ val附加到$ vercodeTEMP。

尝试:

for ($i = 1; $i <= $numITER; $i++) {
    $val = rand(2,36);

    if ($val<10) {
        $vercodeTEMP.=$val;
    } else if ($val != 25 && $val != 19) {
        $vercodeTEMP.=chr(54+$val);
    } else {
        $i=$i-1;
    }
}

答案 1 :(得分:2)

  

我基本上试图避免使用0,1和字母O和I

如果不搞乱魔术数字(除了位置)并使用PHP的range()呢?

$numbers = range(2, 9);
$letters = range('a', 'z');
unset($letters[8], $letters[14]);
$letters = array_merge($letters, array_map('strtoupper', $letters));

$pool = array_merge($numbers, $letters);

shuffle($pool);

$captcha = join(array_slice($pool, 0, $numITER)); // e.g. 2ESQcnMTNy

CodePad