20,398
社区成员




$arr = array(); //每个人所得的钱
$k = 500 ; //总金额
$j = 1000 ; //总人数
$sum = 500 ; //剩余总数
$surplus = 0 ;
$s = 0 ; //剩余人数
for($i=1;$i<=$j;$i++){
$s = $j - $i ;
if($s == 10){
$surplus = number_format($sum / $s,5);//只要控制最后的平均数,就可以做到在成本以下,不控制会高出小数点
//$surplus = number_format($sum / $s,5) - 1;
}
if($s < 10){
$arr[$i] = $surplus;
continue;
}
$rand = rand(18,800) / 100; //随即金额
if($sum / $s < $k / $j){ //如果当前金额/当前人数 < 总额的0.5 那么之后随即就在0.5以下随即.否则可以随即高数
$rand = rand(18,50) / 100;
$sum = $sum - $rand;
$arr[$i] = $rand ;
}else{
$sum = $sum - $rand;
$arr[$i] = $rand ;
}
}
//print_r($arr);
print_r(array_sum($arr));
exit;
我放小了100倍,,大概每次随即都只是多出小数点,也可以控制到金额以下, 也可以控制到完全OK.
后面就简单..我就不写了. 这样就差不多了.
$res=redbag(500,1000,20,0.18);
echo 'count:'.array_sum($res).'<br>';
echo max($res).' - '.min($res);
echo "<pre>";
print_r($res);
echo "</pre>";
function redbag($money ,$count ,$max ,$min){
$avg = $money / $count;
if($max < $avg){
$max = $avg;
}
$res=array();
for($i = 0; $i < $count; $i++) {
$tmpm = mrand($min, $max);
$res[$i] = $tmpm;
$money -= $tmpm;
}
while ($money > 0) {
for ($i = 0; $i < $count; $i++) {
if ($money > 0 && ($res[$i]+$avg) <= $max) {
$res[$i] += $avg;
$money -= $avg;
}
}
};
while ($money < 0) {
for ($i = 0; $i < $count; $i++) {
if ($money < 0 && ($res[$i]-$avg) >= $min) {
$res[$i] -= $avg;
$money += $avg;//money 0.019999999999999 在最后几步出现的,不知道是什么鬼,上一步是 -0.98 + 1
}
}
};
if($money > 0){
$res[0] += sprintf("%.2f", $money);
}
return $res;
}
function mrand($min,$max){
$tmpmin = $min * 100;
$tmpmax = $max * 100;
return rand($tmpmin,$tmpmax) / 100;
}