python模拟微信发红包,并验证随机性!

653 阅读3分钟

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学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地