拼手气红包先领后领相同概率
Posted echo_echo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拼手气红包先领后领相同概率相关的知识,希望对你有一定的参考价值。
拼手气红包先领后领相同概率
想法就是闭着眼睛切西瓜,刀可以切空,当然要先拿出最低部分,比如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;
}
以上是关于拼手气红包先领后领相同概率的主要内容,如果未能解决你的问题,请参考以下文章
拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编