12.编写一个函数,简单模拟微信发红包算法。函数有两个参数:一个参数表示红包总金额,默认值为100;另一个参数表示红包数量,默认值为15。所有随机产生的红包金额(保留两位小数)存放在一个列表(同时作为函数的返回值)中,单个红包金额最少为0.01元,所有红包金额之和应等于红包总金额。最后在主程序中测试该函数,要求对函数的默认值也进行测试。 【思考】 (1)该算法单个红包最多为多少元? (2)该算法产生的随机红包金额有什么特点?是否公平? (3)假设剩余红包金额为M,剩余份数为N,如果将规则改为单个红包金额最少为0.01元,最多为M/N×2元,运行结果有什么变化? (4)能否设计出更公平的发红包算法?
时间: 2024-02-13 15:01:07 浏览: 68
好的,这是你的问题:
编写一个函数,简单模拟微信发红包算法。函数有两个参数:一个参数表示红包总金额,默认值为100;另一个参数表示红包数量,默认值为15。所有随机产生的红包金额(保留两位小数)存放在一个列表(同时作为函数的返回值)中,单个红包金额最少为0.01元,所有红包金额之和应等于红包总金额。最后在主程序中测试该函数,要求对函数的默认值也进行测试。 【思考】 (1)该算法单个红包最多为多少元? (2)该算法产生的随机红包金额有什么特点?是否公平? (3)假设剩余红包金额为M,剩余份数为N,如果将规则改为单个红包金额最少为0.01元,最多为M/N×2元,运行结果有什么变化? (4)能否设计出更公平的发红包算法?
以下是答案:
```python
import random
def send_red_packet(total_amount=100, num_packets=15):
packet_list = []
for i in range(num_packets):
if i == num_packets - 1:
packet_list.append(round(total_amount, 2))
else:
remain_amount = total_amount - sum(packet_list)
remain_num = num_packets - i
max_amount = round(remain_amount / remain_num * 2, 2)
packet_amount = round(random.uniform(0.01, max_amount), 2)
packet_list.append(packet_amount)
return packet_list
# 测试默认值
print(send_red_packet())
# 测试其他值
print(send_red_packet(200, 10))
# (1) 单个红包最多为总金额的2/3
# (2) 产生的随机红包金额呈现正态分布,但对于最后一个红包,其金额会受到之前红包金额的限制
# 这种算法不是非常公平,因为最后一个红包的金额会受到之前红包金额的限制
# (3) 如果将单个红包金额最多改为M/N*2,那么最后一个红包的金额会更为随机,但是由于单个红包金额受到上一次随机数的影响,所以还是不太公平
# (4) 更公平的算法可以是:首先将红包总金额平均分成N份,然后对于每份金额,随机生成一个比例k,最后每个红包的金额即为k*该份金额,这样每个红包的期望值都是相等的,更加公平
```
阅读全文