之前买过几次双色球,还分析历史数据用C#写了一个生成号码的程序,后来找不到了;
最近刚用学习了一下 scrapy,顺便把彩票历史数据爬取下来,接着之前的思路,重新写一个生成号码的程序;
本文里的逻辑和观点不一定对,水平有限,只是用记忆中仅剩的一些高中概率知识分析一下;
背景
按照我之前一个同事的说法,彩票开奖不一定公平,号码有可能是开奖前设定好的;研究了一下开奖流程,隐约感觉里面可能有一些蹊跷,但我没有证据,只是自己胡乱猜测;
这里认为彩票开奖一定是公正公平公开的,单从概率方面考虑,能否用程序预测下次开奖中,出现概率大的号码;
分析
先看一下经典的概率问题 – 抛硬币,我们知道:
- 抛1次硬币,正面、反面朝上的概率各50%;
- 抛100次硬币,两面各自朝上的次数会接近50,因为正面、反面朝上的概率为50%;
- 一直抛下去,两面各自朝上的实际次数 / 总次数 会无限接近50%;
如果已经抛了9999次,正面和反面朝上的次数分别为 5999 和 4000,那下一次抛硬币,反面朝上的概率肯定要大于50%,因为”两面各自朝上的实际次数 / 总次数 会无限接近50%”,向50%靠近的话,反面朝上的概率肯定要大一些;
上面这句是这篇文章的核心,之前写的程序,也是基于这个原理;
接下来看双色球的规则:红球从1-33号球中选6个,蓝球从1-16号球中选1个
先看蓝球,如果之前已经抽了1600次,那根据概率,每个号码出现的次数应该会向100次靠拢,如果一个号码之前出现的次数少于100次,那它下次出现的概率就要大一点点;
红球也是一样的逻辑,每个数字出现的概率为 6/33,如果已经开奖 3300 次,每次随机抽6个号码,那每个号码实际出现的次数会向 3300 * (6/33) = 600 次靠拢,如果某个号码少于 600 次,下一次出现的概率就会大那么一点点;
理论上是这样,但实际中,历史抽奖次数也不过两千多次,还是比较少的;
代码
代码在这儿:http://github.com/sun2dan/spiders/tree/master/lottery,里边包含历史数据的抓取,以及如何根据历史数据预测下一次的号码;
抓取的数据传到百度云了:http://pan.baidu.com/s/1WCxW4sCUrUNr7G_fHN5hgg ,密码:s7b0,spiders/lottery.db;
生成的逻辑如下,对于逻辑的正确性和此方案的可行性,我也不太有自信;基本思路是这样的:
- 假设总体集合为已完成次数的两倍,即当前抽奖已进行了50%;以蓝球来说,在总体集合中,按照出现的概率,各个号码抽到的次数等于总次数除以球的个数;
- 对于总体集合来说,某个号码的球已经出现的百分比 = 实际次数 / 总体集合下的理想值;
- 未来将要出现的百分比 = 1 – 已经出现的百分比
- 根据上面的公式求出各个颜色、各个号码未来将要出现的百分比;
- 然后将各个号码未来将要出现的百分比乘以一个固定的值(放大的比例),比如10000,得到一个结果,然后把相同颜色下所有号码的该结果累加,得到“下次抽奖的集合”;
- 生成随机数,从“下次抽奖集合”中抽取一个值,至此,得到一个随机的数字,如果是蓝球,到这儿就结束了,
- 红球每次抽6个,抽取第二个红球的时候,“下次抽奖集合”需要把第一个球剔除掉,然后重新累加,获取新的“下次抽奖集合”,重复这一步,直至得出6个数字;