【Python练手】抽奖概率测试 - 怎么才能知道获得1w块的概率,真的真的就是万分之一呢?

思路一

(1)10000个 uid 分别抽奖1次
(2)1个 uid 一共抽奖10000次
 --------------------------
两种方式均可,效果一样。
方法(2)更方便,下面的脚本以(2)为例

思路二

//数据库插入数据

1、数据库插入用户记录-1w条
2、模拟用户抽奖-1w次
3、数据表统计奖品次数(count)

以思路一,写脚本

1、1个 uid 抽奖 1w 次

headers ={
xxx
}
n = 0
while n < 10000:
    # 抽奖接口
    url = "http://www.xxx.com/lottery/assign"
    luckyUrl = requests.post(url=url, headers=headers)
    with open('../lottoProb/lotto.txt', 'a+', encoding='utf-8') as f:
        print(luckyUrl.text, file=f)
        print('--------------------\n', file=f)
    print("这是第"+str(n+1) +"次")
    n+=1

2、使用抽奖脚本打印结果,计算概率

awk -v RS="@#$j" '{print gsub(/100块/,"&")}' E:\lottoProb\lotto.txt
awk -v RS="@#$j" '{print gsub(/500块/,"&")}' E:\lottoProb\lotto.txt
awk -v RS="@#$j" '{print gsub(/10000块/,"&")}' E:\lottoProb\lotto.txt

根据统计文本中:100、500、10000块出现次数,计算出概率。完成✅
在这里插入图片描述

假设有n个人参与抽奖,每个人只能抽中一次奖品,抽奖过程中每个人被抽中的概率相等,且每次抽奖后不放回,那么进行k次抽奖后有m个人抽中奖品的概率可以通过计算来得到。 首先,我们需要确定每个人都不会被重复抽中奖品的情况下,抽奖的总方案数为n*(n-1)*(n-2)*...*(n-k+1),表示第一次抽奖有n个人可以中奖,第二次抽奖只剩下n-1个人可以中奖,以此类推,直到第k次抽奖只剩下n-k+1个人可以中奖。 接下来,我们需要确定m个人中奖的方案数。因为每个中奖的人都不能被重复计算,所以我们将第一个中奖的人选定为某个参与者,方案数为n种,第二个中奖的人选定为剩下的参与者中的一个,方案数为n-1种,以此类推,直到选出m个中奖的人,方案数为(n-m+1)*(n-m+2)*...*n。 因此,m个人抽中奖品的概率为: P = (n-m+1)*(n-m+2)*...*n / (n*(n-1)*(n-2)*...*(n-k+1)) 需要注意的是,当k>n时,抽奖的总方案数为0,因此P为0。 下面是一个Python函数,可以用来计算低概率不放回抽奖概率: ```python def lottery_probability(n, k, m): if k > n: return 0 numerator = 1 denominator = 1 for i in range(n-m+1, n+1): numerator *= i for i in range(n, n-k, -1): denominator *= i return numerator / denominator ``` 其中,n表示参与抽奖的人数,k表示进行抽奖的次数,m表示有多少个人抽中奖品。函数返回的是一个概率值,范围在0到1之间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值