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

 

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

想法就是闭着眼睛切西瓜,刀可以切空,当然要先拿出最低部分,比如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;
}

posted on   野生小众  阅读(255)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示