下面的代码生成八位数字,但在存储在 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 位数字的更好方法。
然后,当您的 shuffle 结果以0
's 开头时,它们会掉落。
为了补救,您可以CHAR(8)
在数据库中使用 a 。然后它将显示前导零。
我很惊讶你甚至得到 7 位数。填充不会只是在右侧附加空格吗?如果 rand 函数返回 1 会发生什么?
纯粹靠运气——随机性,你可能会得到 7 位和 8 位数字。尝试一段时间,您应该会开始看到 1 到 8 位数字之间的每个组合。
再加上 Bart 所说的,领先的 0 只会下降。
说到这,如果你有 rand,你为什么需要 shuffle?以下应该足够了。
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