在其他语言中,我会将其部分生成并将其存储在字符串中,但使用PHP时,您无法选择数据类型以使其无效,它会自动设置为整数,然后只能存储到最大值整数大小。
有没有解决方案?
答案 0 :(得分:3)
是的,您可以获取一些随机数据(例如来自/dev/urandom
或openssl_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)
看一下这篇博客文章,似乎很好地总结了这个问题:
答案 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
);