4

下面的代码生成八位数字,但在存储在 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;
4

2 回答 2

5

首先,通过str_pad这样使用,您正在引入空格,这可能会进入您的“随机”数字的中间。

把你的str_pad电话改成这样:

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

摆脱空间。但请注意,其他问题提供了创建随机 8 位数字的更好方法。

然后,当您的 shuffle 结果以0's 开头时,它们会掉落。

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

于 2013-03-14T13:05:12.577 回答
1

我很惊讶你甚至得到 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
于 2013-03-14T13:20:05.883 回答