PHP算法在给定范围内获取第n个数的随机数

时间:2016-02-11 05:54:26

标签: php random numbers shuffle seed

我需要一些PHP算法来获取具有特定输入数字的给定范围内的随机数。

例如,当范围是0 - 1000时。我的输入数是23.当我执行该算法时。我希望给定范围内的精确幻数为23。

此外,我总是希望在给定范围内输入数字的输出编号相同。

我的PHP函数的示例模式

function getMagicNumber($input, $min, $max) {
    // algorithm work
    return $output;
}

echo getMagicNumber(23, 0, 1000); // 561

此外,我使用mt_srandmt_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

注意:输入值的两个输出值不相互匹配。

1 个答案:

答案 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