如何在PHP中生成超过32位限制的随机数?

时间:2010-12-23 23:55:49

标签: php random

在其他语言中,我会将其部分生成并将其存储在字符串中,但使用PHP时,您无法选择数据类型以使其无效,它会自动设置为整数,然后只能存储到最大值整数大小。

有没有解决方案?

6 个答案:

答案 0 :(得分:3)

是的,您可以获取一些随机数据(例如来自/dev/urandomopenssl_random_pseudo_bytes)。

然后使用例如将数据转换为十进制表示。 bcmath或gmp。有关如何执行此操作,请参阅this answer

答案 1 :(得分:1)

mt_rand(0, 10000)将生成随机数的四位数字。多次调用,连接结果:

mt_rand(0, 10000) . mt_rand(0, 10000) . mt_rand(0, 100) - 长数为10位数。

这有很多问题,但对于您的特定用例可能已经足够了。

答案 2 :(得分:1)

我遇到了同样的问题。我有一个函数需要生成一个从0到2 ^ 32-1的随机数(表示为8位十六进制字符串)。 mt_rand()只生成0到2 ^ 31-1之间的数字。

这失败了:

return hexdec(mt_rand(0,4294967295));

我用一行代码解决了这个问题:

return sprintf("%04X%04X", (mt_rand(0,65535)), (mt_rand(0,65535)));

这正是你所建议的,将随机化分解为部分。它生成两个随机数,每个从0到2 ^ 16-1(65,535)(十六进制0000到FFFF),然后使用sprintf将它们连接在一起,将结果零填充为十六进制字符串。

每个数字从0到2 ^ 32-1(十六进制00000000到FFFFFFFF)是可能的。如果你想要一个48位的随机十六进制数(十六进制000000000000到FFFFFFFFFFFF),你可以这样扩展:

return sprintf("%04X%04X%04X", (mt_rand(0,65535)), (mt_rand(0,65535)), (mt_rand(0,65535)));

这对我有用!

答案 3 :(得分:0)

看一下这篇博客文章,似乎很好地总结了这个问题:

http://blog.phphorizons.com/?p=10

答案 4 :(得分:0)

$i = (int) $i;

您可以声明类型。

答案 5 :(得分:0)

我会做的是这样的事情:

function getBigRandom($length, $space = '0123456789', $trim = true) {
    $str = '';
    $spaceLen = strlen($space);
    for ($i = 0; $i < $length; $i++) {
        $str .= $space[mt_rand(0, $spaceLen - 1)];
    }
    if ($trim) {
        $str = ltrim($str, '0');
    }
    return $str;
}

用法:

$random = getBigRandom(15); // Generate up to a 15 digit random number

随机分布应该相当均匀,因为每个小数位的概率都是每种类型的值...用默认参数调用它会产生一个数字。如果你想生成一个字符串(盐等),你可以这样做:

$random = getBigRandom(
    128,
    'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 
    false
);