Python通过最近100期的大乐透数据统计各个数字的概率

前言

前几天商场随机买了几注大乐透彩票花了20元(机选5注,自己手动选了5注),今天发现中了5块钱,好亏啊,想写一个程序程序帮我计算辅助一下哪些数字概率大一些

思路

获取最近100期的号码,统计一下每个数字在100期内的概率,看看是不是在100期内是不是真随机,各数字的概率差距有多大,看下哪些数字的出现次数多

提示:每期中一等奖的都是1/21425712的机会。中大奖概率会很小,每一期都会重置概率。

获取数据

大乐透官网:www.lottery.gov.cn/

选择最近一百期,打开F12,找到任意一期其中一个数字的xpath:/html/body/div[4]/div[2]/div/div/div[1]/table/tbody/tr[1]/td[6]

然后分析一下xpath,使用Chrome 插件:xpath-helper

尝试调整一下xpath ,让插件获取到最近100期的数据:

xpath:/html/body/div[4]/div[2]/div/div/div[1]/table/tbody/tr

把图中RESULTS (100)的内容复制出来进行处理分析处理

处理

原数据内容为:

erlang 复制代码
230330406101125070904061011250709
230340709101524041207091015240412
230350714232529021107142325290211
230360113222631021001132226310210
....

分别是 期号+中奖号码+中奖号码(有重复的中奖号码) 思路:

  • 1.以换行分割得到每一期的内容
  • 2.去掉每一期内容的期数,和重复的中奖号码
  • 3.每隔两个数字分割,得出中奖的每一个数组
  • 4.对数字进行统计次数(前区和后区独立开,因为会重复)

编码

python3 复制代码
import matplotlib.pyplot as plt  
from collections import Counter
from pylab import mpl


begin_all_list = []
end_all_list = []

# 读取文件
with open('./100.txt','r') as f:
    res = f.read()

    for i in res.split('\n'):
        one_data = i[5:-14]
        # print(i,one_data)
        begin,end = one_data[:10],one_data[10:] # 得到前区后区的字符串
        bengin_list = [begin[i:i+2] for i in range(0, len(begin), 2)] # 前区切割成数组
        end_list = [end[i:i+2] for i in range(0, len(end), 2)] # 后区切割成数组
        print(i,one_data,begin,end,bengin_list,end_list)
        begin_all_list += bengin_list # 搜集所有的前区号码
        end_all_list +=end_list # 收集所有后区号码

begin_ball = range(1,36) 
end_ball = range(1,13)

begin_ata_dict = {}
for i in begin_ball: # 遍历计算所有号码在前区号码的出现的次数
    counter = begin_all_list.count('%02d' % i)
    rate = round(counter/(5*100),0)
    begin_ata_dict[str(i)] = {
        "word":counter,
        "count":counter
        }


end_data_dict = {}
for i in end_ball: # 遍历计算所有号码在后区号码的出现的次数
    counter = end_all_list.count('%02d' % i)
    rate = round(counter/(2*100),2)
    end_data_dict[str(i)] = {
        "word":counter,
        "count":counter
        }
print(begin_ata_dict,end_data_dict)

mpl.rcParams["font.sans-serif"] = ["SimHei"]

# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False

count_list = [x['count'] for x in list(begin_ata_dict.values())]
plt.title("前区")
plt.grid(ls="--", alpha=0.5)
print(list(begin_ata_dict.values()), list(begin_ata_dict.values()))
plt.bar(list(begin_ata_dict.keys()), count_list) # 画图指定X,Y轴内容
for i in range(len(count_list)):
    word = list(begin_ata_dict.values())[i]['word']
    print('wrod',word,list(begin_ata_dict.keys())[i])
    plt.text(list(begin_ata_dict.keys())[i], word, word, va="bottom", ha="center") # 柱状图顶部文字

plt.show()

# 暂不能同时显示两张图片,取消注释后单独运行展示

# count_list = [x['count'] for x in list(end_data_dict.values())]
# plt.title("后区")
# plt.grid(ls="--", alpha=0.5)
# print(list(end_data_dict.values()), list(end_data_dict.values()))
# plt.bar(list(end_data_dict.keys()), count_list)
# for i in range(len(count_list)):
#     word = list(end_data_dict.values())[i]['word']
#     print('wrod',word,list(end_data_dict.keys())[i])
#     plt.text(list(end_data_dict.keys())[i], word, word, va="bottom", ha="center")

# plt.show()

统计前区后区的效果:

结论&简单分析

看起来毫无规律,前区出现次数最大差距 22-8=16次,所以我觉得按理来说买热门的数字应该概率大一些。

所以简单分析(复杂的我也不会==!):

前区次数的众数是13次,出现13次的号码是09,12,21,29,31,34,35这几位数

后区次数的众数是14次,出现14次的号码是03,06这几位数

简单分析这几个数字是100期以内出现次数最多的数字,继续接着买出现次数多的数字概率应该大一点吧

jym有什么更好分析的方法呢?

相关推荐
来自天蝎座的孙孙40 分钟前
洛谷P1595讲解(加强版)+错排讲解
python·算法
张子夜 iiii2 小时前
机器学习算法系列专栏:主成分分析(PCA)降维算法(初学者)
人工智能·python·算法·机器学习
跟橙姐学代码3 小时前
学Python像学做人:从基础语法到人生哲理的成长之路
前端·python
鹏多多.3 小时前
flutter-使用device_info_plus获取手机设备信息完整指南
android·前端·flutter·ios·数据分析·前端框架
Keying,,,,3 小时前
力扣hot100 | 矩阵 | 73. 矩阵置零、54. 螺旋矩阵、48. 旋转图像、240. 搜索二维矩阵 II
python·算法·leetcode·矩阵
桃源学社(接毕设)3 小时前
基于人工智能和物联网融合跌倒监控系统(LW+源码+讲解+部署)
人工智能·python·单片机·yolov8
yunhuibin4 小时前
pycharm2025导入anaconda创建的各个AI环境
人工智能·python
杨荧4 小时前
基于Python的电影评论数据分析系统 Python+Django+Vue.js
大数据·前端·vue.js·python
python-行者4 小时前
akamai鼠标轨迹
爬虫·python·计算机外设·akamai
R-G-B5 小时前
【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数)
python·opencv·视频加载·摄像头调用·获取视频基本信息·获取视频帧率·获取视频帧数