拼手气红包先领后领相同概率
拼手气红包先领后领相同概率
想法就是闭着眼睛切西瓜,刀可以切空,当然要先拿出最低部分,比如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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 中的实现