为什么rand()生成一个低数字?

时间:2013-01-20 17:05:21

标签: php

这是我的代码

<?php

function random_id() {
    $chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $id = '';
    for ($i = 0; $i < 5; ++$i)
    {
        $id .= $chars[rand(1, 26)];
    }
    echo $id;
}

random_id();

?>

它一直生成带有5个小写数字的ID,而且偶尔它会有一个数字。我也尝试使用mt_rand(),并在循环之前的脚本开头使用srand(time())srand(microtime())

此外,它应该是rand(1, 26)还是rand(0, 25)

6 个答案:

答案 0 :(得分:8)

您的字符串超过26个字符。请改用此rand函数:

rand(0, strlen($chars) - 1)

因此,您不是在每次迭代时计算字符串长度,而是保持动态,因此值得考虑将计算移到循环之外,如下所示:

$chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$chars_cnt = strlen($chars) - 1;
for ($i = 0; $i < 5; ++$i)
{
    $id .= $chars[rand(1, $chars_cnt)];
}

答案 1 :(得分:4)

您没有生成一个足以获得整个数组的随机数。

小写字符:0-25

数字:26-35

大写汽车:36-61

答案 2 :(得分:2)

0是起始点,strlen($chars)$str字符串中的字符数。

您应该将代码更改为:

    for ($i = 0; $i < 5; ++$i)
    {
        $id .= $chars[rand(0, strlen($chars)-1)];
    }

答案 3 :(得分:1)

我认为您需要记住使用大于26的数字,因为这是字母表中的字母数,您可能要使用26 + 26 + 10 = 62:

$id .= $chars[rand(0, 61)];

干杯!

答案 4 :(得分:1)

PHP中的数组是零索引的,所以是的,调用中的第一个数字应为零。你也只是从阵列的开头挑选。

使用它代替:

for ($i = 0; $i < 5; ++$i)
{
    $id .= $chars[rand(0, 61];
}

答案 5 :(得分:1)

你的$ chars包含一个长度为&gt;的字符串。 26但你的随机数在1到26之间(含)。字符串索引以0开头,即char a。现在只使用字符bcd ... xyz1。您可以动态检查字符串长度并获得有效的随机数。

function random_id() { 
    $chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
    $chars_cnt = strlen($chars)-1; 
    $id = ''; 
    for ($i = 0; $i < 5; ++$i) 
    {   
        $id .= $chars[rand(0, $chars_cnt)]; 
    } 
    return $id; 
} 

echo random_id();