我的任务是:
生成1到20之间的随机数,到小数点1位。
然而,我的问题和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个“银行”与每家银行产生不同的兴趣每小时。大多数情况下,我希望它低,但有时更高,很少很高(15-20%)。
有了上面的代码,随机数就太高了。
对此的任何帮助都是非常感谢的!
发布于 2015-02-22 10:25:44
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();
?>发布于 2015-02-22 12:09:36
这不是PHP特有的问题。
您需要的是一个非线性概率定律,然后可以在PHP中实现。
如果您想要一个以平均值为中心的东西,理想的方法是一个高斯aka正态分布,但是计算它需要各种复杂的技巧,其中大多数都是以增加复杂性为代价为快速生成而优化的。
如果您每小时只生成几个值,那么性能就不是问题了。
一个合理的近似将3或4个随机变量之和,利用中心极限定理。
将任意值相加在0到2倍之间,您的中间速率将创建一个以中间值为中心的高斯近似。如果你不想要低利率的话,你可以夹住低于中间点的值。最终的结果是,获得中等利率的几率为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
}https://stackoverflow.com/questions/28656272
复制相似问题