如何在PHP中生成超过32位限制的随机数?
在其他语言中,我会部分生成它,并将其存储在字符串中,但在PHP中,您不能选择数据类型,因此这不起作用,它会自动设置为整数,然后只能存储到最大整数大小 有什么解决办法吗如何在PHP中生成超过32位限制的随机数?,php,random,Php,Random,在其他语言中,我会部分生成它,并将其存储在字符串中,但在PHP中,您不能选择数据类型,因此这不起作用,它会自动设置为整数,然后只能存储到最大整数大小 有什么解决办法吗 $i = (int) $i; 您可以声明类型。mt_rand(0,10000)将生成随机数的四位数字。多次调用,将结果连接起来: mt_rand(0,10000)。百万兰特(0,10000)。mt_rand(01100)-表示10位长的数字 这有很多问题,但对于您的特定用例来说可能已经足够了。是的,您可以获得一些随机数据(例如,
$i = (int) $i;
您可以声明类型。mt_rand(0,10000)
将生成随机数的四位数字。多次调用,将结果连接起来:
mt_rand(0,10000)。百万兰特(0,10000)。mt_rand(01100)
-表示10位长的数字
这有很多问题,但对于您的特定用例来说可能已经足够了。是的,您可以获得一些随机数据(例如,从
/dev/uradom
或openssl\u random\u pseudo\u bytes
)
然后使用bcmath或gmp等工具将数据转换为十进制表示形式。请参见如何执行此操作。我将执行以下操作:
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;
}
随机分布应该是相当均匀的,因为每一个小数位都有相等的概率成为每一种类型的值。。。使用默认参数调用它将生成一个数字。如果要生成字符串(salt等),可以执行以下操作:
$random = getBigRandom(
128,
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
false
);
我也有同样的问题。我有一个函数需要生成一个从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(65535)(十六进制0000到FFFF),然后使用sprintf将它们连接在一起,并将结果作为十六进制字符串进行零填充
从0到2^32-1(十六进制00000000到FFFFFF)的每个数字都是可能的。如果您想要一个48位的随机十六进制数(十六进制000000到FFFFFFFFFF),您可以这样扩展:
return sprintf("%04X%04X%04X", (mt_rand(0,65535)), (mt_rand(0,65535)), (mt_rand(0,65535)));
这对我有用 在我看来,这不是类型声明,而是更多的类型转换。我不确定这与生成大于
int
类型所能处理的随机数有什么关系……请在您的答案中添加一些解释,以便其他人可以从中学习。就我所见,将变量强制转换为整数不会生成随机数使用GMP扩展,应该可以做到这一点。
return sprintf("%04X%04X%04X", (mt_rand(0,65535)), (mt_rand(0,65535)), (mt_rand(0,65535)));