python3计算双色球_Python3实战:双色球开奖

0、用经典概率学看双色球

双色球的一等奖中奖率大约为1772万分之一,六等奖的中奖概率略大于1/16,即6.25%。如果我们每期投资2元钱买彩票,那么中奖金额的期望略大于5元*6.25%,即0.3125元。从数字表面看,血亏无疑难。

事实上,对于绝大多数长期买彩票的人来说,绝对是稳亏不赚的。那么如果我们有足够的资金,而且有足够长的寿命,一直买彩票,直至中头奖,需要投入多少成本,可以收获多少奖金呢?

1、用Python模拟开奖

大多数彩民买彩票有两种方式:一种是每期机选,即每次随机买不同的号;一种是追号,即每期买同一注号码。为了使用统计具有普遍性,我们将对机选和追号各模拟10次。

实际上,实现本期文章的功能,用很少的代码就可以做到了。由于我们文章的定位是Python3实践,出于学习的需要,我会用比较规范的方式来实现我们的程序。

本文的Python程序将模拟实现如下功能:不计成本地买彩票,直至中头奖励为止,得到整个过程中,花费的金额(每期2元)和得到的资金数量。

由于功能比较简单,大家直接看代码吧:

import random

import time

class Result:

'''开奖结果'''

def __init__(self, reds, blue):

self.reds = set(reds)

self.blue = blue

def HitResult(self, case):

'''计算中奖金额0、未中奖,奖励0元1、一等奖:6+1,奖金除税后800万2、二等奖:6+0,奖金除税后16万3、三等奖:5+1,奖金30004、四等奖:4+1、5+0,奖金2005、五等奖:4+0、3+1,奖金106、六等奖:0+1、1+1,2+1,奖励5元'''

awards_with_blue = [5, 5, 5, 10, 200, 3000, 8000000]

awards_without_blue = [0, 0, 0, 0, 10, 200, 160000]

is_blue_hit = (self.blue == case.blue)

red_hit_num = 0

for ball in case.reds:

if ball in self.reds:

red_hit_num += 1

if is_blue_hit:

return awards_with_blue[red_hit_num]

else:

return awards_without_blue[red_hit_num]

@staticmethod

def IsFirstAward(award):

return award == 8000000

class BicolorBall:

def __Go(self):

'''随机生成一注双色球'''

reds = [i for i in range(1, 34)]

blues = [i for i in range(1, 17)]

random.shuffle(reds)

random.shuffle(blues)

red_ret = reds[:6]

red_ret.sort()

return Result(red_ret, blues[0])

def Draw(self):

'''开奖'''

return self.__Go()

def RandomSet(self):

'''机选一注'''

return self.__Go()

def FreeTry(self):

'''每次机选,直至中一等奖'''

gains = 0

costs = 0

start_sec = time.time()

while True:

result = self.Draw()

my_codes = self.RandomSet()

awd = result.HitResult(my_codes)

gains += awd

costs += 2

if Result.IsFirstAward(awd):

passed_sec = time.time() - start_sec

print("FreeTry: earnt:{}cost:{}time_cost:{}".format(gains, costs, passed_sec))

print("LuckyNumbers:", result.reds, result.blue)

break

def FixedTry(self):

'''追号,买同一注号码,直至中一等奖'''

gains = 0

costs = 0

start_sec = time.time()

my_codes = self.RandomSet()

while True:

result = self.Draw()

awd = result.HitResult(my_codes)

gains += awd

costs += 2

if Result.IsFirstAward(awd):

passed_sec = time.time() - start_sec

print("FixedTry: earnt:{}cost:{}time_cost:{}".format(gains, costs, passed_sec))

print("LuckyNumbers:", result.reds, result.blue)

break

if __name__ == "__main__":

bcb = BicolorBall()

# 每次机选,尝试10次

for i in range(10):

bcb.FreeTry()

# 追号,尝试10次

for i in range(10):

bcb.FixedTry()

2、结果分析

我们分别模拟了10次机选中奖结果和10次追号中奖励结果,其数值如下:

我们对20次结果(样本量虽少,但也够说明问题)取平均值,平均花费大约为2261万,而收益大约为1527万,亏了近三分之一。

从如下图表,我们可以看出,机选和追号两种方式的结果并没有明显的区别。

其中,第17次模拟的成本最低,总花费为大约为188万,大约连续买了94万期,而收益了不错,大约为860万。然而,大部分人,都活不了连续买94万期彩票的命。如果你考虑一次性投入188万,那你应该看看前面平均数值。

我们的数值是基于伪随机生成的结果,在实际的购彩活动中,彩民买彩票是具有一定的偏向性的;另外,奖金也是受到控制的(例如头奖在500W~1000W之间,可以低于500W),所以我们的模拟数据并不能真正体现实际的彩票开奖励现象。在实际的双色球开奖中,平均收益率要比我们这个模拟的平均数值更还低,每注2元的彩票,平均收益大概只有1元,也就是接近50%的亏损。所以,买彩票一定要理性,如果你想着靠买彩票发财,最终,你极大概率是血亏。

3、前5次模拟的头奖号码

以下是前5次模拟的头奖号码,如果你感兴趣,可以试一下10元成本,能收回多少。这是以学习为目的的实践建议,祝君学习快乐。

01、02、07、18、24、31(16)

01、05、07、16、21、32(08)

05、10、14、21、24、26(07)

04、06、17、19、29、31(13)

03、15、21、27、29、31(06)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值