我正在寻找一种使用PHP生成big随机数的方法,例如:
mt_rand($lower, $upper);
我看到的越近是gmp_random(),但是它不允许我仅指定每条边的位数(我不知道它是什么)来指定上下边界。
编辑:Axsuuls的答案似乎非常接近我想要的答案,并且与gmp_random非常相似,但是在一种情况下似乎只有一个缺陷。
假设我不会在之间获得一个随机数:
和:
所以如果该函数被调用BigRandomNumber():
BigRandomNumber($length = 31);
这可以轻松返回超出指定边界的9999999999999999999999999999999。
如何使用最小/最大边界而不是长度值?
BigRandomNumber('1225468798745475454898787465154', '1225468798745475454898787465200');
这应该返回1225468798745475475454898787465 [154 .. 200]]之间的随机数。
作为参考,我认为解决方案可能必须使用function supplied in this question。
编辑:以上帖子已删除,在这里是:
function compare($number1, $operator, $number2) {
$x = bccomp($number1, $number2);
switch($operator) {
case '<':
return -1===$x;
case '>':
return 1===$x;
case '=':
case '==':
case '===':
return 0===$x;
case '!=':
case '!==':
case '<>':
return 0!==$x;
}
}
我正在寻找一种使用PHP生成大随机数的方法,例如:mt_rand($ lower,$ upper);我看得更近的是gmp_random(),但是它不允许我指定较低的和...
尝试以下操作:
生成'n'个随机字符实际上不是一个选择,因为从理论上讲random('9999999999')仍然可以返回1 ...
大整数的范围是1-20。因此,使用mt_rand($lower, $upper)
生成一个数字并与另一个mt_rand($lower, $upper)
相乘
将您的楼层和您的随机数取到该范围内。
这里是伪代码:
您真正需要知道的是相对差距;如果它很小,则可以生成一个从0到最大间隙的数字,然后将最小值加上该数字。
这将为您的巨型随机数提供更多零,并且您还可以指定巨型随机数的长度(您的巨型随机数可以以0开头吗?如果不是,那么也可以轻松实现)
您可以做的是创建一些较小的随机数并将其组合。不确定您实际需要多少。
$lower = gmp_com("1225468798745475454898787465154");
$upper = gmp_com("1225468798745475454898787465200");
$range_size = gmp_sub($upper, $lower);
$rand = gmp_random(31);
$rand = gmp_mod($rand, $range_size);
$result = gmp_add($rand, $lower);
这可能对您有用。 (我不确定您为什么需要它,因此它可能不是最好的方法,但它应该符合您的要求):
/* Inputs:
* min - GMP number or string: lower bound
* max - GMP number or string: upper bound
* limiter - GMP number or string: how much randomness to use.
* this value is quite obscure (see `gmp_random`, but the default
* supplies several hundred bits of randomness,
* which is probably enough.
* Output: A random number between min (inclusive) and max (exclusive).
*/
function BigRandomNumber($min, $max, $limiter = 20) {
$range = gmp_sub($max, $min);
$random = gmp_random();
$random = gmp_mod($random, $range);
$random = gmp_add($min, $random);
return $random;
}
这可能有效:
经过测试和工作