在PHP中生成16位随机数字的最佳方法是什么?

3

我希望在PHP中生成一个长度为16的不重复随机数码,你能告诉我最好的方法吗?我使用以下代码:

$possible = '0123456789';
$code = '';
$i = 0;
while ($i < 14) {
    $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
    $i++;
}
echo($code);

但是那只生成一个随机数。我想要30000个随机数。我该怎么办?
我也使用了这段代码,但是它没有生成16位长度的随机数:
<?php

    $con=mysqli_connect("localhost","root","","test1");
    // Check connection
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysql_connect_error();
    }
    for ($s=0;$s<10;$s++) {
        $possible = '0123456789';
        $code = '';
        $i = 0;
    while ($i < 16) {
        $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
        $i++;
    }
    echo($code);
    echo nl2br("$code <br/>");

    mysqli_query($con,"INSERT INTO test (ID, Code, Type, Used)
    VALUES ('', '".$code."','1', '0')");
    }
    for ($s=0;$s<10;$s++) {
        $possible = '0123456789';
        $code = '';
        $i = 0;
    while ($i < 16) {
        $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
        $i++;
    }
    echo($code);
    echo nl2br("$code <br/>");

    mysqli_query($con,"INSERT INTO test (ID, Code, Type, Used)
    VALUES ('', '".$code."','2', '0')");
    }
    for ($s=0;$s<10;$s++) {
        $possible = '0123456789';
        $code = '';
        $i = 0;
    while ($i < 16) {
        $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
        $i++;
    }
    echo($code);
    echo nl2br("$code <br/>");

    mysqli_query($con,"INSERT INTO test (ID, Code, Type, Used)
    VALUES ('', '".$code."','3', '0')");
    }
    mysqli_close($con);
?>

那段代码运行得很好,返回了 64194616012765。你说的“30000个随机数”是什么意思? - Mr.Web
使用更多熵的uniqid,并使用substr截取。 - Prasanth
2
所以你基本上想要有人修改你发布的代码,因为你无法让它执行3000次迭代? - N.B.
随机不等于唯一,但我同意 for($i=0;$i<3000;$i++){ 是一个好的开始... - Wrikken
显示剩余4条评论
2个回答

4

只需使用rand(pow(10,13),pow(10,14)-1)即可生成一个随机的14位数字 - PHP可以处理长达2 51-1的整数值,如果它们变得太大,PHP会将其静默地转换为双精度浮点数。


1

没有重复数字的代码片段:

$len=14;
$last=-1;
for ($i=0;$i<$len;$i++)
{
    do
    {
        $next_digit=mt_rand(0,9);
    }
    while ($next_digit == $last);
    $last=$next_digit;
    $code.=$next_digit;
}

代码片段用于确保30000以内没有重复数字(但允许重复的数字):

$codes=array();
while (count($codes) < 30000)
{
    $code=rand(pow(10,13),pow(10,14)-1);
    $codes["$code"]=1;
}

代码存储为数组的键(仅为节省一些内存)。
可能有更好的解决方案(尤其是更有效的解决方案)-但这个解决方案真的很短;-)-由于Kolink解决方案的集成。
希望它能有所帮助。
* Jost

这段代码不起作用。我遇到了错误! - mr.sohrab
是的 - do-while 后面至少缺少了一个 ; - 我还没有检查过,但希望现在可以工作。 - Jost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接