python模拟微信发红包,输入金额和红包个数,得到结果,多次发红包,验证先抢后抢红包大小的随机性是否一样。
1、思路
如100元发5个红包,结合几个点几个线段的数学知识,需要在0-100之间取4个不重复的数,即可得到5个区间,每个区间值即为红包金额。
2、代码
import random
def fenhongbao(money, num):
# 钱数最小为1分,为了便于计算取值,需乘100,变成1元进行取值,在1和money*100之间取num-1个点,即可得到num个区间,区间大小即为红包金额。
list_num = random.sample(range(1, int(money*100)), num-1) # 取点
list_num.extend([0, int(money*100)]) # 扩展区间
list_num.sort() # 排序
list_money = [(list_num[index+1]-list_num[index])/100 for index in range(num)] # 区间相减,得到红包金额
for i in range(len(list_money)): # 输出红包金额
print(f'第{i+1}个人抢到:\t{list_money[i]}元')
print(f'恭喜:第{list_money.index(max(list_money))+1}个人手气最佳,抢到{max(list_money)}元,记得请客哦!')
if __name__ == '__main__':
print('\n========随机分红包========\n')
money = float(input('请输入金额(元):')) # 对输入的金额转为浮点型
num = int(float(input('请输入红包个数:'))) # 对输入的红包个数取整
# 如果输入的金额或红包个数不正确,则提示
if money <= 0 or (money*100-round(money*100, 0)) > 10**-10 or num <= 0 or money/num <= 0.01:
print('请检查:\n1、输入金额是否大于0,且最小单位为分;\n2、红包个数是否大于0;\n3、每个红包金额至少为0.01元!')
else:
fenhongbao(money, num)
运行结果如下:
========随机分红包========
请输入金额(元):100
请输入红包个数:5
第1个人抢到: 12.34元
第2个人抢到: 46.48元
第3个人抢到: 3.94元
第4个人抢到: 4.53元
第5个人抢到: 32.71元
恭喜:第2个人手气最佳,抢到46.48元,记得请客哦!
3、验证数据
1000块钱发20个红包,执行一次结果如下:
第1个人抢到: 39.68元
第2个人抢到: 60.7元
第3个人抢到: 35.38元
第4个人抢到: 29.43元
第5个人抢到: 87.84元
第6个人抢到: 30.9元
第7个人抢到: 20.05元
第8个人抢到: 19.8元
第9个人抢到: 55.94元
第10个人抢到: 71.38元
第11个人抢到: 9.75元
第12个人抢到: 30.2元
第13个人抢到: 97.34元
第14个人抢到: 130.62元
第15个人抢到: 29.32元
第16个人抢到: 108.66元
第17个人抢到: 39.45元
第18个人抢到: 76.05元
第19个人抢到: 17.43元
第20个人抢到: 10.08元
恭喜:第14个人手气最佳,抢到130.62元,记得请客哦!
执行1次和10次平均结果如下:
执行100次和1000次平均结果如下:
可以看出随机性基本是一样,先抢、后抢红包的大小的期望是大致相等的,所以趁红包在就抢吧。
近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地