我需要一些PHP算法来获取具有特定输入数字的给定范围内的随机数。
例如,当范围是0 - 1000时。我的输入数是23.当我执行该算法时。我希望给定范围内的精确幻数为23。
此外,我总是希望在给定范围内输入数字的输出编号相同。
我的PHP函数的示例模式
function getMagicNumber($input, $min, $max) {
// algorithm work
return $output;
}
echo getMagicNumber(23, 0, 1000); // 561
此外,我使用mt_srand
和mt_rand
对此进行了测试。但是这些函数正在作为循环过程工作。因此,当我使用数十亿的范围时,这些功能并不安全。
没有循环可能吗?如果可能的话,请帮我解决这个算法。
我从2天开始研究这个问题。但它还没有解决。
这是我目前的算法:
<?php
function getMagicNumber($input, $min, $max)
{
$return = false;
// Optimize input params
list($input, $min, $max) = [intval($input), intval($min), intval($max)];
// Check input params
if ($min < $max && $input >= $min && $input <= $max) {
// Create range
$range = range($min, $max);
// Define some seed value
mt_srand(5);
// Loop process
for ($a = count($range) - 1; $a > 0; $a--) {
$b = @mt_rand(0, $a);
// Get data
list($x, $y) = [$range[ $a ], $range[ $b ]];
// Swap data
$range[ $a ] = $y;
$range[ $b ] = $x;
}
// Extract output
$return = $range[ $input ];
}
return $return;
}
echo getMagicNumber(23, 0, 50); // 18
注意:输入值的两个输出值不相互匹配。
答案 0 :(得分:0)
获取随机数的方法是连续拨打mt_rand
。你无法告诉它在其种子随机表中给你第n个数字。所以如果没有某种形式的循环,你就无法做到这一点。
如果$ max值没有改变很多,你可以保存数字序列,但这似乎也是一个糟糕的解决方案。
如果您只想简单地编写代码,可以执行以下操作:
function getMagicNumber($input, $min, $max)
{
$input = $input < $min ? $min : ($input > $max ? $max : $input);
mt_srand(5);
$result = null;
for ($i = $max; $i >= $input; $i--) {
$result = mt_rand(0, $i);
}
return $result;
}
echo getMagicNumber(23, 0, 50); // 18