需求:
5000元蓖宦,隨機(jī)分給10000人,要求每個(gè)人最少0.01茄厘,最大50;
分析:
5000元分給10000人矮冬,平均每人0.5,如果隨機(jī)0.01-50次哈,那么平均值就在25左右,這就有問(wèn)題了
分化為兩種結(jié)果:
1胎署,在保證剩余人至少能分到0.01的情況下,按照0.01-50進(jìn)行隨機(jī)分配窑滞,這種會(huì)每個(gè)金額都有琼牧,但是絕大部分會(huì)只有0.01,結(jié)果統(tǒng)計(jì)如下:
范圍 | 概率 |
---|---|
0.01 | 98.02% |
(0.01,5] | 0.209% |
(5-10] | 0.182% |
(10-15] | 0.212% |
(15-20] | 0.210% |
(20-25] | 0.187% |
(25-30] | 0.207% |
(30-35] | 0.194% |
(35-40] | 0.203% |
(40-45] | 0.183% |
(55-50] | 0.193% |
代碼如下:
$total=50000;
$num=100000;
$max=50;
$min=0.01;
$rs=red_packet($total,$num,$max,$min);
shuffle($rs);
function red_packet($total,$num,$max,$min){
$re=[];
while ($num>0){
$num--;
$tmp_max=min($max,round($total-$num*$min,2));//保證剩下紅包金額不小于范圍中的最小值
$tmp_min=max($min,round($total-$num*$max,2));//保證剩下紅包金額不大于范圍中的最大值
$money=mt_rand($tmp_min*100,$tmp_max*100)/100;
$total-=$money;
$re[]=$money;
}
return $re;
}
這個(gè)函數(shù)返回的數(shù)組最好使用shuffle函數(shù)打散后再使用
2哀卫,使平均值始終保持在0.5左右巨坊,這樣數(shù)據(jù)會(huì)比較平穩(wěn),金額都相差不大此改,獲得大金額的概率非常低趾撵,統(tǒng)計(jì)結(jié)果如下:
范圍 | 概率 |
---|---|
0.01 | 1.11% |
(0.01,0.2] | 19.54% |
(0.2-0.4] | 19.98% |
(0.4-0.6] | 20.10% |
(0.6-0.8] | 19.75% |
(0.8-1] | 19.45% |
(1,1.2] | 0.07% |
(1.2-50] | 0% |
代碼如下:
$total=5000;
$num=10000;
$max=50;
$min=0.01;
$rs=red_packet($total,$num,$max,$min);
function red_packet($total,$num,$max,$min){
$re=[];
while ($num>0){
$vag=round($total/$num,2);
$num--;
$tmp_max=min($max,round($total-$num*$min,2));//保證剩下紅包金額不小于范圍中的最小值
$tmp_min=max($min,round($total-$num*$max,2));//保證剩下紅包金額不大于范圍中的最大值
$vag_diff=min($tmp_max-$vag,$vag-$tmp_min);//這是波動(dòng)幅度
$end_max=$vag+$vag_diff;
$end_min=$vag-$vag_diff;
$money=mt_rand($end_min*100,$end_max*100)/100;
$total-=$money;
$re[]=$money;
}
return $re;
}
以上兩種都不符合正態(tài)分布,第一種是大部分0.01共啃,小部分在0.01-50之間均勻分布占调,第二種是大部分在0.01-1之間均勻分布暂题,感覺(jué)要想正態(tài)分布,首要條件就是范圍的中間值正好等于總的平均值究珊,但結(jié)果也只會(huì)是均勻分布薪者,就是獲得每個(gè)金額的頻率是相等的,想像不出正態(tài)分布應(yīng)該是什么樣的結(jié)果剿涮。