需求:
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é)果。