我正在寻找一种使用PHP生成大随机数的方法,例如:
mt_rand($lower, $upper);
我看到的距离越近gmp_random()但是它不允许我指定下边界和上边界只有每个肢体的位数(我不知道它是什么)。
编辑:Axsuuls的答案似乎与我想要的非常接近,与gmp_random非常相似,但在一个场景中似乎只有一个缺陷。
假设我不想在两者之间得到一个随机数:
和
因此,如果该函数被称为 BigRandomNumber ():
BigRandomNumber($length = 31);
这很容易返回超出指定边界的9999999999999999999999999999999。
如何使用最小/最大边界而不是长度值?
BigRandomNumber('1225468798745475454898787465154', '1225468798745475454898787465200');
这应该在 1225468798745475454898787465 [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;
}
}
答案 0 :(得分:15)
尝试以下方法:
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);
}
数学如下:将最小值和最大值之间的差值乘以随机百分比,并加到最小值(使用舍入为int)。
答案 1 :(得分:6)
你真正需要知道的是相对差距;如果它很小,那么你可以生成一个从0到最大间隙的数字,然后加上最小值。
答案 2 :(得分:2)
这会在你的巨型随机数中给你更多的零,你也可以指定巨大随机数的长度(你的巨型随机数可以从0开始吗?如果不是,也可以很容易实现)
<?php
$randNumberLength = 1000; // length of your giant random number
$randNumber = NULL;
for ($i = 0; $i < $randNumberLength; $i++) {
$randNumber .= rand(0, 9); // add random number to growing giant random number
}
echo $randNumber;
?>
祝你好运!
答案 3 :(得分:1)
你可以做的是创建一些较小的随机数并将它们组合起来。不确定你实际需要多大。
答案 4 :(得分: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);
完全未经测试: - )
答案 5 :(得分:0)
这可能适合你。 (我不确定你为什么需要它,所以它可能不是最好的方法,但它应该符合你的要求):
<?php
function bigRandomNumber($min, $max)
{
// check input first
if ($max < $min) { return false; }
// Find max & min length of the number
$lenMin = strlen ($min);
$lenMax = strlen ($max);
// Generate a random length for the random number
$randLen = $lenMin + mt_rand(0, $lenMax - $lenMin);
/* Generate the random number digit by digit,
comparing it with the min and max values */
$b_inRange = false;
for ($i = 0; $i < $randLen; $i++)
{
$randDigit = mt_rand(0,9);
/* As soon as we are sure that the number will stay
in range, we can stop comparing it to min and max */
if (!$b_inRange)
{
$tempRand = $rand . $randDigit;
$tempMin = substr($min, 0, $i+1);
$tempMax = substr($max, 0, $i+1);
// Make sure that the temporary random number is in range
if ($tempRand < $tempMin || $tempRand > $tempMax)
{
$lastDigitMin = substr($tempMin, -1);
$lastDigitMax = substr($tempMax, -1);
$tempRand = $rand . @mt_rand($lastDigitMin, $lastDigitMax);
}
/* Check if $tempRand is equal to the min or to the max value.
If it is not equal, then we know it will stay in range */
if ($tempRand > $tempMin && $tempRand < $tempMax)
{
$b_inRange = true;
}
}
else
{
$tempRand = $rand . $randDigit;
}
$rand = $tempRand;
}
return $rand;
}
我尝试了几次,看起来效果还可以。如果需要优化。我们的想法是首先确定随机数的随机长度,使其处于可接受的范围内。然后通过连接逐个生成随机数字到该长度。如果它不在范围内,则在范围内生成一个新的随机数并连接。
我使用PHP将字符串转换为数字以利用字符串函数的事实。当然这会为mt_rand生成警告,但由于我们只使用数字,所以应该可以安全地抑制它。
现在,我不得不说,我很好奇为什么你首先需要这个。
答案 6 :(得分: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;
}
这只是转换为任意精度算术的经典公式rand_range($min, $max) = $min + rand() % ($max - $min)
。如果$max - $min
不是2的幂,它可以表现出一定量的偏差,但如果随机性的位数与$max - $min
的大小相比足够高,则偏差变得可以忽略不计。
答案 7 :(得分:0)
这可能有效:
说明这个想法的示例代码(注意:代码被撤消)
function BigRandomNumber($min,$max) {
// Notice: Will only work when both numbers have same length.
echo (strlen($min) !== strlen($max)) ? "Error: Min and Max numbers must have same length" : NULL;
$min_arr = str_split($min);
$max_arr = str_split($max);
// TODO: This loop needs to operate on 9 chars ($i will increment by $i+9)
for($i=0; $i<=count($max_arr); $i++) {
if($i == 0) {
// First number: >=first($min) and <=first($max).
$new_arr[$i] = rand( $min_arr[0], $max_arr[0]);
} else if($i == count($max_arr)) {
// Last number <= $max .. not entirely correct, feel free to correct it.
$new_arr[$i] = rand(0, substr($max,-1));
} else {
$new_arr[$i] = rand(0,9);
}
}
return implode($new_arr);
}
答案 8 :(得分:0)
经过测试和工作
<?php
$min = "1225468798745475454898787465154";
$max = "1225468798745475454898787465200";
$bigRandNum = bigRandomNumber($min,$max);
echo "The Big Random Number is: ".$bigRandNum."<br />";
function bigRandomNumber($min,$max) {
// take the max number length
$number_length = strlen($max);
// Set the counter
$i = 1;
// Find the base and the min and max ranges
// Loop through the min to find the base number
while ($i <= $number_length) {
$sub_string = substr($min, 0, $i);
// format pattern
$format_pattern = '/'.$sub_string.'/';
if (!preg_match($format_pattern, $max)) {
$base = $sub_string;
// Set the min and max ranges
$minRange = substr($min, ($i - 1), $number_length);
$maxRange = substr($max, ($i - 1), $number_length);
// End while loop, we found the base
$i = $number_length;
}
$i++;
}
// find a random number with the min and max range
$rand = rand($minRange, $maxRange);
// add the base number to the random number
$randWithBase = $base.$rand;
return $randWithBase;
}
?>
答案 9 :(得分:0)
生成'n'随机字符实际上不是一个选项,因为随机('9999999999')理论上仍然可以返回1 ...
这是一个非常简单的功能:
function bcrand($max) {
return bcmul($max, (string)mt_rand() / mt_getrandmax() );
}
请注意,它不会返回N位随机性,只需调整比例
答案 10 :(得分:0)
大整数的范围是1-20。
因此,使用mt_rand($lower, $upper)
生成一个数字并与另一个mt_rand($lower, $upper)
$N1=mt_rand($lower, $upper);
$N2=mt_rand($lower, $upper);
$N3=$N1*N2;
注意:n位数字与n位数字相乘得到n * 2位数字。
答案 11 :(得分:0)
这个问题是在十年前提出的,但对于来自Google恰当答案的人来说,就是gmp_random_range(“ min_value”,“ max_value”)功能。
$range=gmp_random_range("1225468798745475454898787465154", "1225468798745475454898787465200");
echo gmp_strval($range); // displays value as string
答案 12 :(得分:-1)
把你的地板和随机数放在范围内。
1225468798745475454898787465154 + rand(0, 6)
答案 13 :(得分:-1)
这是伪代码:
// generate a random number between N1 and N2
rangesize = N2 - N1 + 1
randlen = length(rangesize) + 4 // the 4 is to get more digits to reduce bias
temp = BigRandomNumber(randlen) // generate random number, "randlen" digits long
temp = temp mod rangesize
output N1 + temp
注意: