文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-10-21 06:59

关注

利用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%

四、最后总结

小编后面又思考了一些方案,并通过代码实现模拟运算,结果如下:
在这里插入图片描述

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

来源地址:https://blog.csdn.net/crleep/article/details/133858569

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯