在PHP中,如何生成一个大的伪随机数?

问题描述 投票:15回答:13

我正在寻找一种使用PHP生成big随机数的方法,例如:

mt_rand($lower, $upper);

我看到的越近是gmp_random(),但是它不允许我仅指定每条边的位数(我不知道它是什么)来指定上下边界。

编辑:Axsuuls的答案似乎非常接近我想要的答案,并且与gmp_random非常相似,但是在一种情况下似乎只有一个缺陷。

假设我不会在之间获得一个随机数:

  • 1225468798745475454898898465154

和:

  • 1225468798745475454898898465200

所以如果该函数被调用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(),但是它不允许我指定较低的和...

php random gmp bcmath
13个回答
16
投票

尝试以下操作:


0
投票

生成'n'个随机字符实际上不是一个选择,因为从理论上讲random('9999999999')仍然可以返回1 ...


0
投票

大整数的范围是1-20。因此,使用mt_rand($lower, $upper)生成一个数字并与另一个mt_rand($lower, $upper)相乘


-1
投票

将您的楼层和您的随机数取到该范围内。


-1
投票

这里是伪代码:


6
投票

您真正需要知道的是相对差距;如果它很小,则可以生成一个从0到最大间隙的数字,然后将最小值加上该数字。


2
投票

这将为您的巨型随机数提供更多零,并且您还可以指定巨型随机数的长度(您的巨型随机数可以以0开头吗?如果不是,那么也可以轻松实现)


1
投票

您可以做的是创建一些较小的随机数并将其组合。不确定您实际需要多少。


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

0
投票

这可能对您有用。 (我不确定您为什么需要它,因此它可能不是最好的方法,但它应该符合您的要求):


0
投票
/* 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;
}

0
投票

这可能有效:


0
投票

经过测试和工作

© www.soinside.com 2019 - 2024. All rights reserved.