10位mt_rand(),带有无偏的第一个数字

时间:2015-07-01 19:46:49

标签: php random

我想在我的软件中生成配置文件ID。 mt_rand函数运行良好,但我需要将id固定为10位数。目前我正在循环mt_rand输出,直到我得到一个10位数字。但我现在面临的问题是,大多数配置文件ID从1开始,有些从2开始。无任何其他单个数字。我理解这是因为mt_rand的范围,并且它不能产生以3或更多开头的10位数字。

这就是我目前正在做的事情

for($i = 0; $i < 200; $i++){
    $num = mt_rand();
    if(strlen($num) == 10) echo $num."<br>";
}

如果你运行上面的代码,你会看到所有数字都从1或2开始。有什么方法可以解决这个问题吗?

编辑:我想我可以翻转数字,但有些数字以零结尾,这看起来有点像黑客。但话说回来,随机数生成本身就是一个黑客攻击。

2 个答案:

答案 0 :(得分:1)

只需在1000000001处启动您的ID,然后在1000000002处启用ID 2,在1000000543处启动ID 543,依此类推?

或者,继续调用mt_rand(1000000001,min((PHP_INT_SIZE&gt; 4?intval(&#34; 9999999999&#34;,10):PHP_INT_MAX),mt_getrandmax()))直到你得到一个尚不存在的ID在你的数据库? (随着你的数据库变得越来越大,这将会越来越多cpu intesive ...当它几乎已满时,如果花费数十亿次迭代和几分钟,我不会感到惊讶。)

答案 1 :(得分:0)

要详细说明Rizier的建议,确保任何字符串(甚至是一串数字)的唯一方法是适合长度和规则的给定模具,一次生成一个字符,然后将它们组合在一起

$str = '';
for($loop = 0; $loop < 10; $loop++) {
    $str .= mt_rand(0,9);
}
echo $str;

然后,您可以为此添加规则。也许您不想要前导0,因此您可以为此添加规则。也许你也想要字母。这将始终为您提供包含所需规则的随机字符串。

您可以在http://3v4l.org/kIRdV

中查看此操作