为什么这个代码生成的随机码有时存储为7位而不是8位


Why the random code generated by this code is storing as 7 digits some times instead of 8 digits

下面的代码生成8位数字,但在db中存储时,它有时存储为7位数字。db列宽度取int(11), db为mysql(5.0.45)

srand ((double) microtime( )*1000000);
 $maxid = rand(0,100000000);
 $mtidno = str_pad($maxid,8);
 $shuffled = str_shuffle($mtidno);
 echo  $shuffled;

首先,通过像这样使用str_pad,您引入了空格,它可以进入您的"随机"数字的中间。

将您的str_pad调用更改为:

str_pad($maxid, 8, "0");

去掉空格。但请注意,其他问题给出了创建随机8位数的更好方法。

然后,当你的洗牌结果从0开始时,它们将下降。

为了补救,您可以在数据库中使用CHAR(8)。然后它将显示前导零。

我很惊讶你竟然得到了7位数。填充符不会简单地将空格附加到右侧吗?如果rand函数返回1会发生什么?

你可能会得到7和8个数字只是纯粹的运气-随机性。尝试一段时间,你应该开始看到1到8个数字之间的每一个组合。

加上Bart所说的,前导0会下降。

说到这个,如果你有rand,为什么你需要洗牌?以下内容应该足够了。

srand ((double) microtime( )*1000000);
$maxid = rand(10000000,99999999);
echo $maxid; 

测试代码(说明错误的逻辑)

srand ((double) microtime( )*1000000);
for($i = 0; $i < 1000000; $i++)
{
    $maxid = rand(0,100000000);
    if($maxid < 100000){
        echo  $maxid . "<br>";
        $mtidno = str_pad($maxid,8);
        $shuffled = str_shuffle($mtidno);
        echo  $shuffled . "<br>";  
    }
}
echo "done <br>";

请参见下面的输出,它清楚地显示了洗牌后的空格。

0
0
12207
20 21 7
82397
78 329
64086
64086
42724
4 4 2 27
21362
216 32
57983
7 3 598