首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Php随机数生成

Php随机数生成
EN

Stack Overflow用户
提问于 2015-02-22 09:16:43
回答 2查看 632关注 0票数 4

我的任务是:

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

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

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

代码语言:javascript
复制
$min = 1;
$max = 20;
$suisse_interest = mt_rand ($min*10, $max*10) / 10

也许如果我简要解释一下我为什么要这样也许会有帮助..。

我拥有一个网络游戏,并希望增加3个“银行”与每家银行产生不同的兴趣每小时。大多数情况下,我希望它低,但有时更高,很少很高(15-20%)。

有了上面的代码,随机数就太高了。

对此的任何帮助都是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-22 10:25:44

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

代码语言:javascript
复制
<?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();
?>
票数 2
EN

Stack Overflow用户

发布于 2015-02-22 12:09:36

这不是PHP特有的问题。

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

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

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

一个合理的近似将3或4个随机变量之和,利用中心极限定理

将任意值相加在0到2倍之间,您的中间速率将创建一个以中间值为中心的高斯近似。如果你不想要低利率的话,你可以夹住低于中间点的值。最终的结果是,获得中等利率的几率为50%,而获得该数值两倍的机会也在稳步减少。

越来越多的金额将“缩小”曲线,使其不太可能获得高价值。

例如:

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28656272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档