PHP ранд генерирует нули, хотя диапазон должен быть от 2 до 36? - PullRequest
1 голос
/ 09 мая 2011
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 ]

2 голосов
/ 09 мая 2011

В основном я стараюсь избегать 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 .

2 голосов
/ 09 мая 2011

Если $ 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;
    }
}
...