题目:
- 所有人抢到金额之和等于红包金额,不能超过,也不能少于
- 每个人至少抢到一分钱
- 要保证所有人抢到金额的几率相等
python实现(二倍均值法)
- 红包剩余金额为M,剩余红包个数为N,每一次抢到的金额 money = random(0,M*2/N)
import random
num = int(input("输入红包的个数:"))
money = float(input("输入红包的金额:"))
# 剩余红包金额为M,剩余人数为N,那么有如下公式:每次抢到的金额 = 随机区间 (0, M / N X 2)
def redWars(num,money):
# 被抢的金额
sum = 0
# 剩余的红包个红素
count = num
# 记录金额的总数
_money = money
# 使用循环来抢红包
for i in range(1, num+1):
# 每一次抢到的金额
get_money = round(random.uniform(0, float(2 * money / count)),2)
print('%s 号玩家抢到了 %s' % (i, get_money))
# 剩余的金额等于总得金额减去被抢的金额
money -= get_money
# 红包的个数减一
count -= 1
# 被抢的金额求和
sum += get_money
# 判断红包剩余的个数,如果只剩余一个了,则最后一个人全部抢走,算法结束
if count == 1: # 最后一个人,分得剩余的所有
print('%s 号玩家抢到了 %s' % (num, round(_money - sum,2)))
break
print('红包总金额为 ',round(round(_money - sum,2)+sum, 2))
redWars(num,money)