Php 随机数生成

Php random number generate

我的任务:

生成1到20之间的随机数,精确到小数点后一位。

然而我的问题和mt_rand一样简单。我希望生成的大多数数字在 0.5 - 4.5 左右较低,偶尔的数字在 4.5-10 之间,很少说每 12-20 小时一次在 10-20 之间。

我一直在使用以下内容,但不知道从哪里开始。我是一个非常基础的自学程序员。

$min = 1;
$max = 20;
$suisse_interest = mt_rand ($min*10, $max*10) / 10

也许如果我简要解释一下我想要这个的原因可能会有所帮助..

我拥有一个在线游戏,想添加 3 个 "banks" 每个银行每小时产生不同的利息。大多数时候我希望它低,但有时更高,很少非常高 (15-20%)。

使用上面的代码,随机数变得太高了。

非常感谢任何帮助!

你需要一个指数计算。如果您使用类似于以下函数的函数,则低数字的概率会增加。当然,您需要稍微调整一下数字以提供适合您需要的输出。

$i = 0;
while($i<30) {
    $i++;
    $rand = mt_rand(0, 7000) / 100; // 0.0 ~ 70.0
    // This is the most important line:
    $output = round( 20*(pow(0.95,$rand)) , 1);
    echo "$output ";
}

示例输出:

1.8  4.3  2.6  5.5  3.7  15.5  1.6  0.6  0.6  1.6  5.8  
1.3  6.1  3.2  0.8  1.7  14.7  7.9  1.3  10.3  5.5  12.6  
1.5  8.4  1.5  0.9  13.3  5.8  7.5  1.7  

如您所见,打印的数字大多较小。

在我的代码中,获得 20 的概率约为 1.4%,而获得数字 smaller than 5 的概率约为 78%

试试this.The概率到1.0~4.5在96%左右,4.5~10.0在2%左右,10.0~20.0在2%左右。

<?php
    // 1.0~4.5    96%
    // 4.5~10.0   2%
    // 10.0~20.0  2%

    function fun() {
        $num = mt_rand(1, 100);
        if ($num > 0 && $num <= 96) {
            $return = mt_rand(10, 45) / 10;  // 96%
        } else if ($num > 96 && $num <= 98) {
            $return = mt_rand(45, 100) / 10;  // 2%
        } else {
            $return = mt_rand(100, 200) / 10;  // 2%
        }
        return sprintf("%01.1f",$return);
    }

    echo fun();
?>

这不是 PHP 特有的问题。

您需要的是非线性概率定律,然后您可以在 PHP 中实现它。

如果你想要以平均值为中心的东西,理想的是 gaussian aka normal distribution,但计算它需要各种复杂的技巧,其中大多数都经过优化以快速生成,但代价是增加了复杂性。

如果您每小时只生成几个值,性能将不是问题。

一个合理的近似是对 3 或 4 个随机变量求和,利用 central limit theorem.

对介于 0 和中间值两倍之间的随机值求和将创建以中间值为中心的高斯近似值。 如果您不想要低利率,则可以将低于中间点的值固定下来。最终结果是获得中等利率的机会为 50%,而获得该价值两倍的机会稳步下降。

越来越多的总和将 "narrow" 曲线,使其不太可能获得高值。

例如:

define ("INTEREST_MEAN", 10);
define ("INTEREST_SPREAD", 5);
function random_interest ()
{
    $res = 0;
    for ($i = 0 ; $i != INTEREST_SPREAD ; $i++) $res += mt_rand(0, 2*INTEREST_MEAN);
    $res /= INTEREST_SPREAD; // normalize the sum to get a mean-centered result
    $res = max ($res, INTEREST_MEAN); // clamp lower values
}