Python统计指定号码的历史中奖情况

前言

生活在寸土寸金的帝都,买房变成了一件可遇而不可求的事情,作为一个朝九晚九挣工资的人来说,买房或许只是出现在梦里,但是梦想总是要有的,万一实现了呢?其实真正赚钱的方式都明明白白地写在了刑法里,可是咱可是本分人,不能做哪些违法的事情,想要赚钱买房,还有一种比较随意的方式——买彩票,如今这帝都的房价,不是你中一张500万彩票就能买得起的,如果要买的起,那就需要中两张!

经历

中两张500万的彩票,想想就知道这种概率有多大了,跟你被天上掉下的陨石砸中脑袋差不多,是不是感觉没有希望了,不过不要灰心嘛,万一你要被砸中了呢?

对于预测彩票号码这件事情,很抱歉,我不是神仙,没有方法可以办到,不过有件事你需要知道一下:那就是双色球自从问世以来,十几年间从未出现过一次号码完全相同的情况,也就是说你买个和历史号码一样的,基本中不了大奖了,但是也不一定,万一就有两颗陨石同时砸中你呢!

对于买彩票这件事,有的人喜欢买一个号,坚持多年从不动摇,一心做着发财梦;而有的人却是很随意,每天机选,靠天吃饭;还有一部分大神就比较高端了,每天窝在彩票投注站里,写写画画,仿佛可以窥探天机一样,每期少则几十,多则几百的砸着自己的血汗钱,我劝你们还是醒醒吧。

而我呢,就属于半个第一种人,坚持着一个号,做着发财梦,偶然间看到彩票投注站就买一张,遇不到就算了,典型的佛系彩票购买者,这样买了一段时间,忽然有个想法,我买的这个号到底在历史上中没中过大奖呢?于是作为程序猿的我决定写个程序查一下不就好了,所以才有了下面这段代码。

代码

  1. 引入库函数,其实需要的函数特别简单,就是要处理csv格式的双色球历史开奖数据。

    1
    import csv
  2. 定义奖项,也就是中奖号码情况与奖项的对应关系,注意中一个篮球是6等奖哟!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # list award classify
    award_classify = {
    (6,1): 1,
    (6,0): 2,
    (5,1): 3,
    (5,0): 4,
    (4,1): 4,
    (4,0): 5,
    (3,1): 5,
    (3,0): 0,
    (2,1): 6,
    (2,0): 0,
    (1,1): 6,
    (1,0): 0,
    (0,1): 6,
    (0,0): 0
    }
  3. 定义比对函数,这个函数要能判断出我的号码跟一个历史号码相比,中了几个红球和蓝球。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # count red balls and blue balls
    def count_red_blue_balls(my_number, history_number):
    red_count, blue_count = 0, 0
    my_index, history_index = 0, 0
    while my_index < 6 and history_index < 6:
    if my_number[my_index] == history_number[history_index]:
    my_index += 1
    history_index += 1
    red_count += 1
    elif my_number[my_index] < history_number[history_index]:
    my_index += 1
    else:
    history_index += 1

    if my_number[6] == history_number[6]:
    blue_count = 1

    return red_count, blue_count
  4. 查询历史中奖情况,使用我选择的号码和历史开奖情况逐一比对,得到每个奖项中奖次数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # count award situation of my number
    def count_award_situation(my_number):
    local_award_statistics = [0,0,0,0,0,0,0]
    with open('lottery_history_data.csv', 'r') as file:
    data_content = csv.reader(file)
    for row_data in data_content:
    local_award_statistics[award_classify[count_red_blue_balls(my_number,
    list(map(int, row_data[1:8])))]] += 1
    return local_award_statistics
  5. 展示查询结果,将统计结果以友好的方式呈现。

    1
    2
    3
    4
    5
    6
    7
    # show award statictics for a number
    def show_award_result(my_number, award_statistics):
    print("my number is %s\n" % my_number)
    print("history award record list:")

    for index in range(0,7):
    print("award %d: %4d times" % (index, award_statistics[index]))
  6. 启动函数,读取自己定义的号码,然后进行统计

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # main function
    if __name__ == '__main__':
    #my_number = [5,6,10,11,25,30,11]
    #my_number = [5,8,10,15,26,30,6]
    print("请输入6个红球和1个蓝球号码,空格分隔:")
    my_number = list(map(int, input().split()))

    award_statistics = count_award_situation(my_number)
    show_award_result(my_number, award_statistics)

运行结果


lottery_statistics

总结

  1. 这段代码只是一时好奇的产物,所以说好奇心带来了生产力。
  2. 统计代码只是做简单使用,所以一些特殊情况并未判断,比如输入字母或者未排序的数字。
  3. 看到我的号码连个4等奖都没有中过,不知道是该高兴还是难过,是不是这个大奖在等着我啊!
  4. 说到这也该结束了,不好意思上周六(20180113)买的双色球又中了6等奖,明天(20180121)要去领奖喽!

源码

代码传送门(附双色球历史数据):一触即达

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客