给力星

Web Developer

买彩票机选和守号哪个中奖概率高?

我有买彩票,不过就是瞎买买。早之前是随机买过一注,然后一直买这个号,不过断过一段时间没买,后来就一直是每期机选一注了。算起来也有一年多了,但目前最高奖金还是停留在5元…

于是乎就冒出了这么一个想法,机选跟守号(随意买的,没有刻意去研究彩票)哪个中奖的可能性高一些?

本着实践出真知的想法,顺便学习下拖了很久的Python网络爬虫,写了个小程序,抓取了历年大乐透/双色球的开奖数据,进行了简单的验证。

抓取彩票开奖数据

Python网络爬虫,结合pyQuery解析HTML内容,很容易就将历年开奖数据保存到本地csv文件中。

抓取、保存大乐透历年开奖数据:

# coding: utf-8
# 抓取大乐透的历年开奖数据
# author: 给力星(www.powerxing.com)
import urllib2
from pyquery import PyQuery as pyq
import csv

def writeToCsv(jq, writer):
    table = jq('.tr3')

    for i in table:
        vol = pyq(i).find('td.b').text()
        red = pyq(i).find('td.cred').text().split()
        blue = pyq(i).find('td.cblue').text().split()
        data = [int(vol)]
        for item in red:
            data.append(int(item))
        for item in blue:
            data.append(int(item))

        writer.writerow(data)

csvfile = file('daletou.csv', 'wb')
writer = csv.writer(csvfile)
writer.writerow(['期号', '红1', '红2', '红3', '红4', '红5', '蓝1', '蓝2'])

url = 'http://www.sunlava.com/daletou_history.htm'
index = 0

while (url):
    print index, url
    index += 1

    req = urllib2.Request(url)
    response = urllib2.urlopen(req)
    html = response.read()
    jq = pyq(html)
    writeToCsv(jq, writer)
    url = jq('.page-next').attr('href')
    if url:
        url = 'http://www.sunlava.com/' + url

csvfile.close()
print 'done'

验证机选、守号哪种中奖概率高

这个写起来也没什么难度,主要是使用 Python 中集合的取交集运算,判断是否中奖,中几等奖:

# coding=utf-8
# 测试大乐透的中奖概率
# author: 给力星(www.powerxing.com)
import csv
import random

# 中奖红球,中奖篮球,我的红球,我的蓝球
def isWin(vol, wRed, wBlue, mRed, mBlue):
    if len(wRed) != 5 or len(wBlue) != 2 or len(mRed) != 5 or len(mBlue) != 2:
        print '出错!,位数不对!', vol, wRed, wBlue, mRed, mBlue, exit()

    R = len( wRed & mRed )
    B = len( wBlue & mBlue )
    if R == 5 and B == 2:
        return 1
    elif R == 5 and B == 1:
        return 2
    elif (R == 5) or (R == 4 and B == 2):
        return 3
    elif (R == 4 and B == 1) or (R == 3 and B == 2):
        return 4
    elif (R == 4) or (R == 3 and B == 1) or (R == 2 and B == 2): 
        return 5
    elif (R == 3) or (R == 2 and B == 1) or (R == 1 and B == 2) or (B == 2):
        return 6
    else:
        return 0

# 读取数据
csvfile = file('daletou.csv', 'rb')
reader = csv.reader(csvfile)

data = []
first_row = True
for line in reader:
    if first_row: # 过滤首行
        first_row = False
    else:
        vol = int(line[0])
        red = set()
        blue = set()
        for item in line[1:6]:
            red.add(int(item))
        for item in line[6:8]:
            blue.add(int(item))

        d = {
            'vol': vol,
            'red': red,
            'blue': blue
        }
        data.append(d)

data.reverse() # 按照从最早到最新的期数顺序
csvfile.close()

# 设置
N = 1000    # 设置迭代次数
prize = [0, 7923000, 131000, 4900, 200, 10, 5]  # 奖金,浮动奖金取最近15期的平均值
print '期数', len(data)
print '迭代次数', N

# 机选模式
result = [0]*7
for i in range(N):
    for item in data:
        vol = item['vol']
        wRed = item['red']
        wBlue = item['blue']

        # 每一期都机选一注彩票
        mRed = set(random.sample(range(1, 36), 5))
        mBlue = set(random.sample(range(1, 13), 2))

        w = isWin(vol, wRed, wBlue, mRed, mBlue)
        result[w] += 1

win_money = 0
for i in range(1, 7):
    win_money += result[i]*prize[i]

print '\n=== 机选模式 ==='
print '得奖次数', result
print '总花费', len(data)*2*N
print '总收益', win_money


# 追号模式
result = [0]*7
for i in range(N):
    # 每次迭代机选一注彩票作为守号
    mRed = set(random.sample(range(1, 36), 5))
    mBlue = set(random.sample(range(1, 13), 2))

    for item in data:
        vol = item['vol']
        wRed = item['red']
        wBlue = item['blue']

        w = isWin(vol, wRed, wBlue, mRed, mBlue)
        result[w] += 1

win_money = 0
for i in range(1, 7):
    win_money += result[i]*prize[i]

print '=== 追号模式 ==='
print '得奖次数', result
print '总花费', len(data)*2*N
print '总收益', win_money

print 'done!'

大乐透的数据是从07年到14年097期这7年多共1114期的数据,测试结果如下(注意,下面的图片有错,第二个模式应该是追号模式):

迭代次数1,即验证买彩7年共1114期:

买大乐透彩票7年的中奖可能结果买大乐透彩票7年的中奖可能结果

买大乐透彩票7年的中奖可能结果买大乐透彩票7年的中奖可能结果

1114期的量比较少,结果相对不稳定。

再来看看迭代次数10的情况,就是70年,大概也就是这一生能买的彩票数了:

买大乐透70年的中奖可能结果买大乐透70年的中奖可能结果

结果已经相对稳定了,再看看迭代次数1000:

测试结果测试结果

结果已经很稳定了,可以看出,不论机选还是守号,收益都差不多,大概是投入的1/4。

最后看看迭代次数5000的情况:

测试结果测试结果

显然,如果没有中头奖,绝对是亏的节奏。

至于双色球,机选和守号的概率也基本持平:

双色球的测试结果双色球的测试结果

而且总体来看,双色球收益与投入比略高于大乐透,但没有中一二等奖的话反正都是亏…

本文只是简单的测试,但也能看出来,随意的机选或者守号,中奖概率真差不多,毕竟彩票头奖是接近两千万分之一的概率(双色球1/17721088,大乐透1/21425712,摘自网络),一般人买的彩票数比起来真不算什么。而且如果不是中头奖、二等奖,随意的买彩票肯定是亏的。彩票的黑幕也爆出不少,水深得很,买买彩票就当当娱乐好了,不必太认真。

有兴趣的可以下载我的数据继续研究下买彩票有没有什么靠谱点的诀窍哈:Python抓取双色球/大乐透历年中奖数据

2条评论

发表评论

电子邮件地址不会被公开。