码迷,mamicode.com
首页 > 其他好文 > 详细

拼手气红包先领后领相同概率

时间:2018-04-28 00:21:12      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:==   i++   最小值   for   bsp   就是   elf   分割   mon   

 

拼手气红包先领后领相同概率

想法就是闭着眼睛切西瓜,刀可以切空,当然要先拿出最低部分,比如10个人分,拿出10*0.01元(最小领1分钱),其他的随便切成相应的份数,每个加上最小备用金1分钱,缺点不适合设置每个红包的最大值,最小值。

这个模型可以解决每个红包大小绝对大小概率相同

/*
* 随机分割
* $money 红包总金额(单位分)
* $people 红包平分个数
* $max 单个红包最大(单位分)
* $min 单个红包最小(单位分)
* */
static public function split_bonus($money,$people,$min=1,$max=5000000){


$save_money = $people*$min;#保底红包
$bonus_max_index=0;//最大红包索引
$bonus_max=0;//最大红包值
$bonuses = array();//红包仓库

if($save_money>$money)//
return false;

if($save_money==$money) {//特殊情况处理平分最低红包
for($i=1;$i<=$people;$i++){
$bonuses[]=$min/100;
}
return [‘bonus‘=>$bonuses,‘bonus_max_index‘=>0];
}

 

if($save_money<$money) {
$walls = self::build_wall($money-$save_money, $people - 1);
if ($walls) {
foreach ($walls as $k => $v) {
if ($k > 0) {
$bonus = $walls[$k] - $walls[$k - 1];

if ($bonus_max < $bonus) {
$bonus_max_index = $k - 1;
$bonus_max = $bonus;
}
$bonus = ($bonus + $min)/100;
$bonuses[] = $bonus;
}
}
// echo array_sum($bonuses);
return [‘bonus‘=>$bonuses,‘bonus_max_index‘=>$bonus_max_index];
} else {
return array();
}
}

}

/*
* 不同的位置砌墙
* */
static public function build_wall($area,$wall_num){
$walls=array();
if($area) {
while ($wall_num > 0) {
$wall = mt_rand(0, $area);
// while (in_array($wall, $walls)) {
// $wall = mt_rand(0, $area);
// }
$walls[] = $wall;
$wall_num--;
}
$walls[] = 0;
$walls[] = $area;
sort($walls);
}
// print_r($walls);
return $walls;
}

拼手气红包先领后领相同概率

标签:==   i++   最小值   for   bsp   就是   elf   分割   mon   

原文地址:https://www.cnblogs.com/echoecho/p/8965506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!