Php随机数生成

Php随机数生成,php,random,Php,Random,我的任务: 生成1到20之间的随机数,精确到小数点后1位 但是我的问题很简单。我希望生成的大多数数字在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家“银

我的任务:

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

但是我的问题很简单。我希望生成的大多数数字在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家“银行”,每家银行每小时产生不同的兴趣。大多数时候,我希望它低,但有时高,很少非常高(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 ";
}
$i=0;

而($i试试这个。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中实现

如果你想要一个以平均值为中心的东西,理想的方法是a,但是计算它需要各种复杂的技巧,其中大多数都是为了快速生成而优化的,代价是增加复杂性

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

一个合理的近似值是3或4个随机变量之和,利用

将介于0和两倍中间速率之间的随机值相加,将创建一个以中间值为中心的高斯近似值。 如果你不想要低利率,那么你可以钳制低于中间点的值。最终结果是获得中间利率的几率为50%,而获得该值两倍的几率则稳步下降

越来越多的总和将“缩小”曲线,使其不太可能获得高值

例如:

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
}

可能的重复由于要创建的分发是,因此可以使用将分发(统一)映射到所需的分发(可以任意创建)。也可以使用box-muller变换,但效率较低(由于您经常这样做,您可能需要预计算ziggurat算法中描述的表)。很好,这个和另一个答案都起作用了。正是我想要的!谢谢!非常感谢,这帮了大忙。现在一切都变得更有意义了!如果您不介意的话,再来一个问题。我如何享受回声乐趣()我知道下面的内容毫无意义,但也许会让我的目标更清晰。$interest=(fun()的结果)mysql_query(“更新r$game[0]$tab[pimp]SET suisseint=$interest其中id=$user1no[id];”);谢谢!很抱歉因为春节而迟到。您的SQL是正确的,请检查表结构,然后重试。
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
}