1. 程式人生 > 其它 >【python分析】買彩票機選和守號哪個中獎概率高?

【python分析】買彩票機選和守號哪個中獎概率高?

作者:Powerxing 廈門大學計算機系13級研究生

很多人有買彩票,不過就是瞎買買。早之前是隨機買過一注,然後一直買這個號,不過斷過一段時間沒買,後來就一直是每期機選一注了。算起來也有一年多了,但目前最高獎金還是停留在5元…

於是乎就冒出了這麼一個想法,機選跟守號(隨意買的,沒有刻意去研究彩票)哪個中獎的可能性高一些?

本著實踐出真知的想法,順便學習下拖了很久的Python網路爬蟲,寫了個小程式,抓取了歷年大樂透/雙色球的開獎資料,進行了簡單的驗證。

抓取彩票開獎資料

Python網路爬蟲,結合pyQuery解析HTML內容,很容易就將歷年開獎資料儲存到本地csv檔案中。

抓取、儲存大樂透歷年開獎資料:

# coding: utf-8# 抓取大樂透的歷年開獎資料# author: 給力星(www.powerxing.com)import urllib2from pyquery import PyQuery as pyqimport csvdef 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 = 0while (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/' + urlcsvfile.close()print 'done'

驗證機選、守號哪種中獎概率高

這個寫起來也沒什麼難度,主要是使用 Python 中集合的取交集運算,判斷是否中獎,中幾等獎:

# coding=utf-8# 測試大樂透的中獎概率# author: 給力星(www.powerxing.com)import csvimport 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 = Truefor 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]*7for 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] += 1win_money = 0for i in range(1, 7):    win_money += result[i]*prize[i]print 'n=== 機選模式 ==='print '得獎次數', resultprint '總花費', len(data)*2*Nprint '總收益', win_money# 追號模式result = [0]*7for 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] += 1win_money = 0for i in range(1, 7):    win_money += result[i]*prize[i]print '=== 追號模式 ==='print '得獎次數', resultprint '總花費', len(data)*2*Nprint '總收益', win_moneyprint 'done!'

大樂透的資料是從07年到14年097期這7年多共1114期的資料,測試結果如下(注意,下面的圖片有錯,第二個模式應該是追號模式):

迭代次數1,即驗證買彩7年共1114期:

買大樂透彩票7年的中獎可能結果

買大樂透彩票7年的中獎可能結果

1114期的量比較少,結果相對不穩定。

再來看看迭代次數10的情況,就是70年,大概也就是這一生能買的彩票數了:

買大樂透70年的中獎可能結果

結果已經相對穩定了,再看看迭代次數1000:

測試結果

結果已經很穩定了,可以看出,不論機選還是守號,收益都差不多,大概是投入的1/4。

最後看看迭代次數5000的情況:

測試結果

顯然,如果沒有中頭獎,絕對是虧的節奏。

至於雙色球,機選和守號的概率也基本持平:

雙色球的測試結果

而且總體來看,雙色球收益與投入比略高於大樂透,但沒有中一二等獎的話反正都是虧…

本文只是簡單的測試,但也能看出來,隨意的機選或者守號,中獎概率真差不多,畢竟彩票頭獎是接近兩千萬分之一的概率(雙色球1/17721088,大樂透1/21425712,摘自網路),一般人買的彩票數比起來真不算什麼。而且如果不是中頭獎、二等獎,隨意的買彩票肯定是虧的。彩票的黑幕也爆出不少,水深得很,買買彩票就當當娛樂好了,不必太認真。