如何使用rand()处理大数

  • 本文关键字:处理 何使用 rand php
  • 更新时间 :
  • 英文 :


如何生成不超过特定范围的数字?

的例子:

我想生成一个数字,有70位,但不超过" 9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000& quot;

怎么做?

我尝试使用gmp_init

$range1 = gmp_init("100000000000000000000000000000000000000000000000000000000000000000000000000");
$range2 = gmp_init("900000000000000000000000000000000000000000000000000000000000000000000000000");
$generatedValue = rand($range1,$range2);
echo $generatedValue;

但是,它输出以下错误:

PHP: rand()期望参数1是int,对象给定

我试着兰德(),mt_rand (), random_byte()…

另一个尝试:

<?php
$rand1 = gmp_random_range(100000000000000000000000000000000000000000000000000000000000000000000000000,900000000000000000000000000000000000000000000000000000000000000000000000000>

echo gmp_strval($rand1) . "n";

错误:PHP警告:gmp_random_range():无法将变量转换为GMP -/home/ubuntu/test/test5. PHP在线

让我们澄清一些混淆之处:

  • PHP的本地整数最大为2的63次方,因为它们存储在64位内存中,而第64位用于负数(我稍微简化了一下)。无论你把它放在源代码的哪个地方,比这个大的数字都不能作为PHP整数存在,甚至不能短暂地存在。
  • GMP是一个以不同方式存储数字的库,可以表示高于此值的数字。但是它不能看到你在源代码中输入的东西,你必须传递给它一些PHP可以表示的其他值,这就是为什么GMP函数接受字符串和整数。
  • 普通的PHP函数不知道GMP -你不能将GMP编号对象传递给普通的数学函数或其他函数,你必须使用GMP库中的函数。(有一个例外,你可以对GMP对象使用像+和*这样的操作符,PHP会为你调用相应的函数。)

记住这些,我们可以查看手册中的GMP功能列表,并找到以下内容:

gmp_random_range(GMP|int|string $min, GMP|int|string $max): GMP

正是我们需要的!注意,它可以接受三种不同类型的参数:

  • 整数,这在我们的例子中不是很好,因为我们不能创建足够大的整数
  • GMP对象,如您使用gmp_init
  • 创建的对象
  • 字符串,就像你用来创建GMP对象的字符串

所以写你的例子最简单的方法是:

$rand1 = gmp_random_range('100000000000000000000000000000000000000000000000000000000000000000000000000','900000000000000000000000000000000000000000000000000000000000000000000000000');

这将返回一个GMP对象,所以你需要寻找其他GMP函数来决定下一步如何处理它。

php和大多数编程语言中的数字都有不能超过的最大值和最小值。
PHP_INT_MAX定义的最大整数,PHP_FLOAT_MAX定义的最大浮点数。

但是如果你想要一个大于这个最大数字界限的随机字符串。您可以将许多随机数进行字符串连接以获得此随机字符串:

$largeRandomString = mt_rand(10000000, 99999999).mt_rand(10000000, 99999999).mt_rand(10000000, 99999999).mt_rand(10000000, 99999999);

该方案生成一个固定长度为70个字符的字符串,数字间隔为0到9。只需要基本的PHP函数。对于32位系统,必须修改算法。

$min = "1000000000000000000000000000000000000000000000000000000000000000000000";  
$max = '9000000000000000000000000000000000000000000000000000000000000000000000';
do{
for($str = "", $i=0; $i < 7; $i++){
$str .= sprintf("%010d",mt_rand(0,9999999999));
}
}while($str < $min OR $str > $max);
var_dump($str);
//string(70) "8225821562698285549247617814952633507395510882337701683734245940552330"

范围过滤器基于简单的字符串比较。因此,$min和$max必须包含正好70个字符。

最新更新