如何生成不超过特定范围的数字?
的例子:
我想生成一个数字,有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个字符。