3

我想在 PHP 中生成一个不重复且长度为 16 的随机数代码。最好的方法是什么?我使用这段代码:

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

但这会产生 1 个随机数。我想要 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);
?>
4

2 回答 2

3

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

于 2013-07-18T09:28:17.860 回答
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 的解决方案。

希望它有点帮助。

*约斯特

于 2013-07-18T09:36:55.070 回答