100分求一个随机数生成的算法 500000元分给1000000个人,每个人分0.18到88元,正好分完。请问如何使用算法实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单的,复杂的搞不来,计算你那个 500000,1000000 要计算几分钟缺点,没有最大值,钱都比较平均,做个参考吧.....$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;} $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. 后面就简单..我就不写了. 这样就差不多了. 学习php的步骤?各位大侠请指教? 打开数据库连接代码出现乱码? discuz php版数据库不停的连接 mssql_query("select * from 美沙酮门诊病人",$this->connection) 乱码问题 批量编辑内容问题php 用Snoopy类给THINKPHP框架的网站远程POST数据 令牌验证总是为真? php中嵌套Ajax脚本,运行时什么都没有出现 如何把字符串转换成条件判断? 刚过24岁生日,请教一下程序员的女人问题 求教 有没有onethink的视频教程 关于dedecms网站与内容分离。 php qq互联,怎么会前后的session不一样
缺点,没有最大值,钱都比较平均,做个参考吧.....$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;
}
$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.
后面就简单..我就不写了. 这样就差不多了.