智能红包分配算法:实现均衡随机金额分配

本文介绍了如何使用PHP实现一个仿照微信红包功能的抢红包算法,包括确定金额范围、生成随机金额和均衡分配过程。还探讨了两种改进方法:凑合的均衡分配和推荐的二倍均值法,以及不同场景下的模拟结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现仿照微信发红包功能的抢红包算法需要考虑以下几个步骤:

  1. 确定红包金额范围:根据总金额和总人数,确定红包的金额范围,确保每个人能抢到最低为0.01的金额,且金额相对均衡。

  2. 生成随机金额:在确定的金额范围内,生成每个人抢到的随机金额,确保金额相对均衡。

  3. 金额分配:根据生成的随机金额,分配给每个人。

下面是一个简单的PHP代码示例,实现上述功能:

function distributeRedPacket($totalAmount, $totalPeople) {
    // 确保每个人能抢到最低为0.01的金额
    $minAmount = 0.01;
    // 计算红包可分配的金额范围
    $maxAmount = $totalAmount / $totalPeople * 2;
    // 初始化红包金额数组
    $redPacket = [];

    // 遍历分配每个人的红包金额
    for ($i = 0; $i < $totalPeople; $i++) {
        // 如果是最后一个人,保证剩余的金额都分配给他
        if ($i == $totalPeople - 1) {
            $redPacket[$i] = round($totalAmount, 2);
        } else {
            // 生成随机金额,确保均衡
            $randomAmount = mt_rand($minAmount * 100, $maxAmount * 100) / 100;
            // 确保剩余金额足够分配给剩下的人
            $totalAmount -= $randomAmount;
            $maxAmount = $totalAmount / ($totalPeople - $i - 1) * 2;
            $redPacket[$i] = round($randomAmount, 2);
        }
    }

    return $redPacket;
}

// 示例调用
$totalAmount = 10; // 总金额
$totalPeople = 5;  // 总人数

$redPacket = distributeRedPacket($totalAmount, $totalPeople);
print_r($redPacket);

演进:均衡分配(凑合)

假设:3个人抢20元的红包。
操作:甲抢到6.66,乙抢到6.66,丙兜底抢剩余的的6.68。
结论:算法简单,但随机性差点。

function red_envelope($money, $person) {
	$div = bcdiv($money, $person, 2);
	for($i = 1; $i <= $person; $i++) {
		$res[$i] = $person === $i ? $money - $div * ($i - 1) : $div;
	}
	return $res;
}

演进:二倍均值法(推荐)

假设:假设10个人抢100元红包。
操作:取0.01~(剩余金额 / 剩余人数 * 2)之间的随机数(2为常数,用于影响结果使其趋向平均值),最后一人兜底剩余金额。
结论:二倍均值法理论上可实现相对均衡的随机金额。

function red_envelope($money, $person) {
    $arr   = [];
    for($i = 0; $i < $person; $i ++) {
        $arr[$i] = $money;
        if($person !== ($i + 1)) {
            $arr[$i]  = bcdiv(mt_rand(1, intval($money / ($person - $i) * 200)), 100, 2);
            $money = bcsub($money, $arr[$i] , 2);
        }
    }
    return $arr;
}

理想情况下平均每人金额在10元上下,以下是模拟:

第几人下限随机金额上限随机金额上限随机金额算法理论平均金额实际随机金额
10.0120.00100 / 10 * 210.0012.25
20.0119.5087.75 / 9 * 29.766.87
30.0120.2280.88 / 8 * 210.1211.22
40.0119.9069.66 / 7 * 29.9610.01
50.0119.8859.65 / 6 * 29.950.85
60.0123.5258.80 / 5 * 211.7719.56
70.0119.6239.24 / 4 * 29.814.23
80.0123.3435.01 / 3 * 211.689.85
90.0125.1625.16 / 2 * 212.5912.59
1012.57
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT·Null

没有人会去使用打赏这个功能。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值