Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中生成超过32位限制的随机数?_Php_Random - Fatal编程技术网

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

如何在PHP中生成超过32位限制的随机数?,php,random,Php,Random,在其他语言中,我会部分生成它,并将其存储在字符串中,但在PHP中,您不能选择数据类型,因此这不起作用,它会自动设置为整数,然后只能存储到最大整数大小 有什么解决办法吗 $i = (int) $i; 您可以声明类型。mt_rand(0,10000)将生成随机数的四位数字。多次调用,将结果连接起来: mt_rand(0,10000)。百万兰特(0,10000)。mt_rand(01100)-表示10位长的数字 这有很多问题,但对于您的特定用例来说可能已经足够了。是的,您可以获得一些随机数据(例如,

在其他语言中,我会部分生成它,并将其存储在字符串中,但在PHP中,您不能选择数据类型,因此这不起作用,它会自动设置为整数,然后只能存储到最大整数大小

有什么解决办法吗

$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)));