随机取整



所以,我得到了两个数字,比如A和B。

A是任何正数,B是介于0和100之间的百分比。

我需要的是A的百分比B,但随机向上或向下取整,例如

A = 15, B = 50, result=7(50%) or 8(50%)
A = 10, B = 33, result=3(67%) or 4(33%)

我当前的代码是

floor($A* ($B + rand(0, 9) ) / 100)

但我认为这是不正确的,有更好的解决方案。

编辑:

我已经复习了答案,并实际测试了它们(在这里)。提交的解决方案的问题是,它们都使用rand(0,1),这意味着在50%的情况下,它总是会急剧向上或向下取整。但这里有一个问题:例如,让我们再次考虑"a=10,B=33"的情况。如果B=31或B=39,基本上没有区别。我想要的是对应百分比(例如,90%的情况下31会导致3次,10%的情况下4次)

从我的回答中可以看出,我最初的解决方案似乎还可以。我最初应该提到这不仅仅是"随机取整",并更好地解释第二种情况。

最初的想法是,我有一个数组,比如说,10个项目,我需要得到其中的33%。我不能一直给出其中的3或4个,因为这会打乱整个百分比。所以从长远来看,我需要它至少在统计上是正确的。

但不管怎样,谢谢你抽出时间。

function myround($a, $b) {
    $d = $a * $b / 100.0;
    $f = floor($d);
    if ((rand() / getrandmax()) > ($d - $f)) return $f + 1.0;
    return $f;  
}

与其随机决定哪种取整方式(这会随机扭曲结果,并给你带来非确定性函数),为什么不像银行家那样"取整到偶数"呢?

echo(round(1.5,0,PHP_ROUND_HALF_EVEN) . "<br>");
echo(round(-1.5,0,PHP_ROUND_HALF_EVEN) . "<br>");

这样4.5轮对4轮,3.5轮对4。因此,根据你的意愿,50%的时间你的中点会向上取整,50%的时候你的中点也会向下取整。

为什么不将计算百分比和决定如何取整的问题解耦?

$X = $A * $B / 100;
$Y = (rand(0,1) > 0) ? floor($X) : ceil($X);

最新更新