[Python小项目] 利用Python进行彩票选择方案及分析

利用Python进行彩票选择方案及分析

一、前言

你是否曾梦想过一夜暴富?是否曾想过如果能幸运地中得大奖,生活会有怎样的改变?彩票,这个看似简单的游戏,却可能为我们带来巨大的财富。然而,如何选择号码,如何分析彩票,却是一门学问。在这篇文章中,我们将使用Python探讨彩票的选择方案及分析,帮助你更好地掌握彩票游戏的诀窍,离梦想更近一步。
彩票选择方案及分析在彩票游戏中具有举足轻重的地位。正确地选择号码,可以增加中奖的概率,而错误的选择则可能导致与大奖无缘。
我们首先需要理性对待彩票,将其作为一种娱乐方式,而不是寄希望于它来解决财务问题。
我们需要通过分析历史开奖数据来了解号码的出现规律和趋势。这一过程可以帮助我们判断哪些号码在当前较为热门,哪些号码较为冷门。
彩票选择方案及分析是一项需要长期学习和实践的技能。通过掌握科学的方法和技巧,我们可以提高中奖概率,从而离梦想更近一步。
在选择彩票号码时,我们需要从不同的角度进行分析。
首先,对于历史开奖数据的分析是十分关键的。通过观察历史数据,我们可以了解哪些号码在过去的开奖中出现的频率较高,哪些号码较为冷门。一般来说,热码的出现概率要高于冷码,因此在选择号码时可以适度偏向热码。同时,我们还要注意观察连号、同尾号等特殊形态的出现频率,这些也可以作为选号的参考因素。
其次,概率学知识在彩票选择中也具有重要的作用。利用概率计算方法,我们可以对不同的选号方案进行概率评估,从而选择出最优的方案。

二、分析代码

2.1 获取历史数据

建立Caipiao类,并通过指定的彩票网站下载历史数据,经过简单的数据整理并做好数据持久化工作。如下:

class Caipiao:
    def __init__(self, kaiguan=False):
        """
        获取并更新所需要的数据,组合成字典。存放在"ssq_data.pik"文件中。其中:
            key                                                 value
        dabao_shuju             列表形式,第1个元素包含原始数据,第2个元素包含号码,第3个元素包含匹配结果
        suoyou_yuanshi_shuju    所有的原始数据
        suoyou_qianqu_haoma     所有的前区号码
        suoyou_houqu_haoma      所有的后区号码
        suoyou_haoma            所有的号码
        suoyou_qianqu_haoma_pipei   所有的前区号码匹配结果
        :param kaiguan: 是否更新的开关。True为更新。
        """
        self.ssq_qianqu_kexuan = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33']
        self.ssq_houqu_kexuan = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16']
        if kaiguan:
            # 处理并更新ssq
            ssq_data = {}
            url = r'https://e.17500.cn/getData/ssq.TXT'
            r = requests.get(url=url, proxies=vNetProxies)
            datas = str(r.text).split('\n')[:-1]
            suoyou_yuanshi_shuju = []
            suoyou_qianqu_haoma = []
            suoyou_houqu_haoma = []
            suoyou_haoma = []
            suoyou_qianqu_haoma_pipei = []
            dabao_shuju = []
            for i in datas:
                dabao_shuju_temp = []
                yuanshi_shuju_temp = i.split(' ')
                suoyou_yuanshi_shuju.append(yuanshi_shuju_temp)
                suoyou_qianqu_haoma_temp = yuanshi_shuju_temp[2:8]
                suoyou_qianqu_haoma.append(suoyou_qianqu_haoma_temp)
                suoyou_houqu_haoma_temp = yuanshi_shuju_temp[8]
                suoyou_houqu_haoma.append(suoyou_houqu_haoma_temp)
                suoyou_haoma_temp = yuanshi_shuju_temp[2:9]
                suoyou_haoma.append(suoyou_haoma_temp)
                suoyou_qianqu_haoma_pipei_temp = self.ssq_pipei(suoyou_qianqu_haoma_temp)
                suoyou_qianqu_haoma_pipei.append(suoyou_qianqu_haoma_pipei_temp)
                dabao_shuju_temp.append(yuanshi_shuju_temp)
                dabao_shuju_temp.append(suoyou_haoma_temp)
                dabao_shuju_temp.append(suoyou_qianqu_haoma_pipei_temp)
                dabao_shuju.append(dabao_shuju_temp)
            ssq_data['dabao_shuju'] = dabao_shuju
            ssq_data['suoyou_yuanshi_shuju'] = suoyou_yuanshi_shuju
            ssq_data['suoyou_qianqu_haoma'] = suoyou_qianqu_haoma
            ssq_data['suoyou_houqu_haoma'] = suoyou_houqu_haoma
            ssq_data['suoyou_haoma'] = suoyou_haoma
            ssq_data['suoyou_qianqu_haoma_pipei'] = suoyou_qianqu_haoma_pipei
            with open('ssq_data.pik', 'wb') as f:
                pickle.dump(ssq_data, f)

2.2 判断中奖情况

在给定购买的号码和中奖的号码,判断此次双色球是否中奖,并中了几等奖。几等奖就返回数字几,如果未中奖则返回0。

@staticmethod
    def ssq_zhongjiang(buy, right):
        """
        在给定购买的号码和中奖的号码,判断此次双色球是否中奖,并中了几等奖。
        :param buy: 购买的号码
        :param right: 一等奖的号码
        :return: 几等奖就返回数字几,如果未中奖则返回0
        """

        if len(set(buy[:-1]) & set(right[:-1])) == 6 and buy[-1] == right[-1]:
            return 1  # 一等奖:7个球全中
        elif len(set(buy[:-1]) & set(right[:-1])) == 6:
            return 2  # 二等奖:6个红球全中
        elif len(set(buy[:-1]) & set(right[:-1])) == 5 and buy[-1] == right[-1]:
            return 3  # 三等奖:5个红球和1个蓝球(3000)
        elif (len(set(buy[:-1]) & set(right[:-1])) == 4 and buy[-1] == right[-1]) or len(set(buy[:-1]) & set(right[:-1])) == 5:
            return 4  # 四等奖:4个红球和1个蓝球 或者 5个红球(200)
        elif (len(set(buy[:-1]) & set(right[:-1])) == 3 and buy[-1] == right[-1]) or len(set(buy[:-1]) & set(right[:-1])) == 4:
            return 5  # 五等奖:3个红球和1个蓝球 或者 4个红球(10)
        elif (len(set(buy[:-1]) & set(right[:-1])) >= 1 and buy[-1] == right[-1]) or buy[-1] == right[-1]:
            return 6  # 六等奖:1-2个红球和1个蓝球 或者 1个蓝球(5)
        else:
            return 0  # 未中奖

三、方案分析

接下来是给定不同的方案,并通过大量数据模拟计算该方案的中奖率,以此来判断该方案的优劣。

3.1 方案一

首先,来看下纯机选的方案。也就是随机选择6个前区号码和1个后区号码。具体的分析方法如下:
1、每次在最近 500期 内随机选择一组作为目标中奖号码,共选择100次
2、机选号码 100万组 并和第1步选择到的目标中奖号码进行匹配中奖情况。
共模拟1亿次。
运行代码如下:

    def ssq_dashuju_01(self):
        """
        说明:
        1、每次在最近 500期 内随机选择一组作为目标中奖号码,共选择100次
        2、机选号码 100万组 并和第1步选择到的目标中奖号码进行匹配中奖情况。
        """
        with open('ssq_data.pik', 'rb') as f:
            suoyou_haoma = pickle.load(f)['suoyou_haoma']
        all_result = []
        start_num = 1
        count_num = 100
        step = 1
        for row in range(start_num, count_num * step + start_num, step):
            temp = random.randrange(-500, 0)  # 选中该期模拟运算(最近的500期)
            result = [0] * 7
            result[0] = row
            right = suoyou_haoma[temp]
            for cols in range(100_0000):
                buy = random.sample(self.ssq_qianqu_kexuan, 6) + random.sample(self.ssq_houqu_kexuan, 1)
                zhongjiang = self.ssq_zhongjiang(buy, right)
                if zhongjiang:
                    result[zhongjiang] = result[zhongjiang] + 1
                    # print(buy, right, zhongjiang)
            all_result.append(result)
        sheet = Handle_Workbook(file_name='caipiao_dashuju.xlsx', sheet_name='ssq01')
        sheet.write(all_result, write_position=[3, 1], issave=False)
        sheet.write([round(time.time() - begin, 0)], write_position=[118, 9])

结果如下:

总购买次数: 1亿
总中奖次数: 6710767
总中奖概率: 6.7108%
总金额: 2亿
1等奖次数及概率: 11:0.0000%
2等奖次数及概率: 76:0.0001%
3等奖次数及概率: 880:0.0009%
4等奖次数及概率: 43580:0.0436%
5等奖次数及概率: 775424:0.7754%
6等奖次数及概率: 5890796:5.8908%
本次耗时: 3005

3.2 方案二

第二个方案具体的分析方法如下:
1、每次在最近 500期 内随机选择一组作为目标中奖号码,共选择100次
2、在当期的前N期(N会变动)中奖号码之中随机一次性选择6个前区号码和1个后区,但选择好的号码必须符合最近400次的匹配结果。未匹配则舍弃。
匹配结果:每组号码,按照大小、奇偶、质合进行分析,可以得到该组号码的分析序列。比如:[‘10’, ‘11’, ‘12’, ‘13’, ‘26’, ‘28’, ‘11’]的匹配结果是:‘小小小小大大偶奇偶奇偶偶合质合质合合’
3、机选号码 100万组 并和第1步选择到的目标中奖号码进行匹配中奖情况。
共模拟1亿次。
运行代码如下:

    def ssq_dashuju_02(self):
        with open('ssq_data.pik', 'rb') as f:
            datas = pickle.load(f)
        suoyou_haoma = datas['suoyou_haoma']
        suoyou_qianqu_haoma_pipei = datas['suoyou_qianqu_haoma_pipei']
        suoyou_qianqu_haoma = datas['suoyou_qianqu_haoma']
        suoyou_houqu_haoma = datas['suoyou_houqu_haoma']
        self.ssq_qianqu_kexuan = []
        self.ssq_houqu_kexuan = []
        all_result = []
        start_num = 50
        count_num = 100
        step = 1
        for row in range(start_num, count_num * step + start_num, step):
            print((row - start_num) // step + 1)
            temp = random.randrange(-500, 0)  # 选中该期模拟运算(最近的500期)
            result = [0] * 7
            row_temp = int(row / 2)
            result[0] = row_temp
            right = suoyou_haoma[temp]  # 该期号码
            ssq_qianqu_kexuan_temp = suoyou_qianqu_haoma[temp - row_temp:temp]
            for item in ssq_qianqu_kexuan_temp:
                self.ssq_qianqu_kexuan.extend(item)
            ssq_houqu_kexuan_temp = suoyou_houqu_haoma[temp - row_temp:temp]
            self.ssq_houqu_kexuan.extend(ssq_houqu_kexuan_temp)
            for cols in range(10000):
                pipei = set(suoyou_qianqu_haoma_pipei[temp - 400:temp])
                chose_qianqu = []
                while len(set(chose_qianqu)) < 6 or self.ssq_pipei(chose_qianqu) not in pipei:
                    chose_qianqu = random.sample(self.ssq_qianqu_kexuan, 6)
                    chose_qianqu = sorted(chose_qianqu)
                chose_qianqu = list(chose_qianqu)
                chose_houqu = random.sample(self.ssq_houqu_kexuan, 1)
                buy = chose_qianqu + chose_houqu
                zhongjiang = self.ssq_zhongjiang(buy, right)
                if zhongjiang:
                    result[zhongjiang] = result[zhongjiang] + 1
                    # print(buy, right, zhongjiang)
            all_result.append(result)
        sheet = Handle_Workbook(file_name='caipiao_dashuju.xlsx', sheet_name='ssq06')
        sheet.write(all_result, write_position=[3, 1], issave=False)
        sheet.write([round(time.time() - begin, 0)], write_position=[118, 9])

结果如下:

总购买次数: 1亿
总中奖次数: 6984056
总中奖概率: 6.9841%
总金额: 2亿
1等奖概率: 6:0.0000%
2等奖概率: 95:0.0001%
3等奖概率: 1044:0.0010%
4等奖概率: 49666:0.0497%
5等奖概率: 851405:0.8514%
6等奖概率: 6081840:6.0818%
本次耗时: 16945

3.3 方案三

该方案和方案二类似,只不过在选择号码时,不是一次性选择6个前区号码,而是一个个的选择,全部选择后再进行匹配,匹配通过则进行模拟,否则舍弃。代码就不贴出来了。
结果如下:

总购买次数: 1亿
总中奖次数: 7097713
总中奖概率: 7.0977%
总金额: 2亿
1等奖概率: 8:0.0000%
2等奖概率: 78:0.0001%
3等奖概率: 995:0.0010%
4等奖概率: 45351:0.0454%
5等奖概率: 797147:0.7971%
6等奖概率: 6254134:6.2541%

四、最后总结

小编后面又思考了一些方案,并通过代码实现模拟运算,结果如下:
[Python小项目] 利用Python进行彩票选择方案及分析_第1张图片

可以看到,方案3的中奖概率最高,方案2和方案9最稳定。但是,总的来说,不管选择哪种方案,这中奖率都是低的可怜,所以想通过彩票发家致富,是不太可能了。不过,日常生活中,偶尔购买个几注,调剂调剂生活还是可以的。

你可能感兴趣的:(Python小项目,python,Python项目,彩票,双色球)