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

Ali*_*xel 15 php random gmp bcmath

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

mt_rand($lower, $upper);
Run Code Online (Sandbox Code Playgroud)

我看到的距离越近gmp_random()但它不允许我指定下边界和上边界只有每个肢体的位数(我不知道它是什么).

编辑:Axsuuls答案似乎非常接近我想要的,非常类似于gmp_random,但在一个场景中似乎只有一个缺陷.

假设我不想在两者之间得到一个随机数:

  • 1225468798745475454898787465154

和:

  • 1225468798745475454898787465200

因此,如果函数名为BigRandomNumber():

BigRandomNumber($length = 31);
Run Code Online (Sandbox Code Playgroud)

这很容易返回超出指定边界的9999999999999999999999999999999.

如何使用最小/最大边界而不是长度值?

BigRandomNumber('1225468798745475454898787465154', '1225468798745475454898787465200');
Run Code Online (Sandbox Code Playgroud)

这应该返回1225468798745475454898787465 [154 .. 200]之间的随机数.

作为参考,我相信解决方案可能必须使用此问题中提供功能.

编辑:上面的帖子被删除了,这里是:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*t K 16

请尝试以下方法:

function BigRandomNumber($min, $max) {
  $difference   = bcadd(bcsub($max,$min),1);
  $rand_percent = bcdiv(mt_rand(), mt_getrandmax(), 8); // 0 - 1.0
  return bcadd($min, bcmul($difference, $rand_percent, 8), 0);
}
Run Code Online (Sandbox Code Playgroud)

数学如下:将最小值和最大值之间的差值乘以随机百分比,并加到最小值(舍入为int).


RCI*_*CIX 6

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