2015-02-10 46 views
0

所以,我有两个数字,比如说,A和B.随机舍入

A是任意正数,B是0到100

之间的百分比我需要的是一个百分比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) 

,但我相信这是不正确的,并有更好的解决方案了这一点。

编辑:

我查看答案,实际测试过他们(here)。提交的解决方案的问题是它们都使用rand(0,1),这意味着在50%的情况下,它总是会进行无限累加。但是这里有一个问题:例如,再次采取“A = 10,B = 33”的情况。如果B = 31或B = 39,则基本上没有区别。我想要的是对应的百分比(例如31会导致3在90%的时间和4在10%的情况下)

从我能看到的答案,似乎我的原始解决方案将工作只是精细。我原本应该提到,这不仅仅是“随机四舍五入”,并且解释第二种情况会好一点。

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

但无论如何,谢谢你的时间。

+6

'兰特(0,1)地板($ A/100 * $ B):小区($ A/100 * $ B)'' – sectus 2015-02-10 12:29:09

+0

A = 10,B = 33,结果= 3(67%)或4(33%)' - 这67%是什么意思? – sectus 2015-02-10 12:36:31

+0

哦,删除我的答案,因为仙人掌可能是东西。我猜这个百分比意味着一个四舍五入的加权概率。...... – VolkerK 2015-02-10 12:39:42

回答

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

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – Burimi 2015-02-10 18:44:33

+0

我回过头来仔细阅读这个问题,并且这个功能准确而精确地提供了每一个细节,提问者的要求。我看不出有任何理由删除它或更改它的单个字母。我建议你自己重新阅读这个问题。 – 2015-02-10 20:20:12

+0

实际上,它并没有正确回答我的问题。我用更多的解释和结论对它进行了编辑。不管怎样,谢谢。 – 2015-02-10 21:24:43

1

与其随机决定采用哪种方式进行取整(这会随机歪曲结果并给予非确定性函数),为什么不做银行家们做的和“甚至到达”?

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%的时间你的中点会四舍五入,按你们的要求。

1

为什么不解决计算百分比和决定如何四舍五入的问题?

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