双色球笔记3--输出所有中奖号码

 

1、功能

本文主要根据中奖类别输出所有中奖号码,双色球奖项分为6种,如下所示:
一等奖(6+1)中奖概率为:红球33选6乘以蓝球16选1=1/17721088=0.0000056%;
二等奖(6+0)中奖概率为:红球33选6乘以蓝球16选1=15/17721088=0.0000846%;
三等奖(5+1)中奖概率为:红球33选5乘以蓝球16选1=162/17721088=0.000914%;
四等奖(5+0、4+1)中奖概率为:红球33选5乘以蓝球16选0=7695/17721088=0.0434%;
五等奖(4+0、3+1)中奖概率为:红球33选4乘以蓝球16选0=137475/17721088=0.7758%;
六等奖(2+1、1+1、0+1)中奖概率为:红球33选2乘以蓝球16选1=1043640/17721088=5.889%;
共计中奖率:6.71%。

 

2、代码

根据双色球种类,笔者将其进行如下归类。左边红球表示1到6-右边蓝球表示7,*表示不同的个数,.表示相同的个数,以下计算都约定红球升序。

1)综合预览

该部分计算各项中奖数量、中奖率等问题:

# -*- coding:utf-8 -*-
def fn(x):
ret = 1
for i in range(1,x+1):
ret = ret*i
return ret

def cn(x,y):
ret = fn(x)/(fn(y)*fn(x-y))
return ret

if __name__=='__main__':
ret = 16*cn(33,6)
print('All:',ret)
ret1 = 1
print('L1',ret1)
ret2 = 15
print('L2',ret2)
ret3 = cn(6,5)*27
print('L3',ret3)
ret4 = cn(6,5)*27*15+cn(6,4)*cn(27,2)
print('L4',ret4)
ret5 = cn(6,4)*cn(27,2)*15+cn(6,3)*cn(27,3)
print('L5',ret5)
ret6 = cn(6,2)*cn(27,4)+cn(6,1)*cn(27,5)+cn(27,6)
print('L6',ret6)
retSum = ret1+ret2+ret3+ret4+ret5+ret6
print('retSum:',retSum)
print('Rate:',1.0*retSum/ret)

2)单项实现

根据约定,笔者将1-6等奖的抽象分布归纳如下:

Level1:包括 ......-.
L1只包括1种情况,sum=1

Level2:包括 ......-*
L2只包括1类,sum=15=1*15

Level3:包括 .....*-.
L3只包括1类,sum=162=C(6,5)*C(27,1)*1
说明:红球5个相同1个不同C(6,5)*C(27,1),蓝球相同

Level4:包括 .....*-* 和 ....**-.
L4包括2类,sum=7695=L3*15+C(6,4)*C(27,2)*1
L4_1:.....*-*
说明:红球5个相同1个不同C(6,5)*C(27,1),蓝球不同C(15,1),即L3*15
L4_2:....**-.
说明:红球4个相同2个不同C(6,4)*C(27,2),蓝球相同

Level5:包括 ....**-* 和 ...***-.
L5包括2类,sum=137475=L4_2*15+C(6,3)*C(27,3)*1
L5_1:....**-*
说明:红球4个相同2个不同C(6,2)*C(27,4),蓝球不同C(15,1),即L4_2*15
L5_2:...***-.
说明:红球3个相同3个不同C(6,3)*C(27,3),蓝球相同

Level6:包括 ..****-. 和 .*****-. 以及 ******-.
L6包括3类,sum=1188988=C(6,2)*C(27,4)*1+C(6,1)*C(27,5)*1+C(27,6)*1
L6_1:..****-.
说明:红球2个相同4个不同C(6,2)*C(27,4),篮球相同
L6_2:.*****-.
说明:红球1个相同5个不同C(6,1)*C(27,5),篮球相同
L6_3:******-.
说明:红球0个相同6个不同C(27,6),篮球相同

 代码如下:

# -*- coding:utf-8 -*-
import csv

def SaveToCSV(dataList,fileName,rwtype='w'):
with open(fileName, rwtype, newline='') as csvfile:
writer = csv.writer(csvfile)
for row in dataList:
writer.writerow(row)

def Level1(lsList):
print('\nL1',lsList)
print('......-.')
retList = [lsList]
return retList

def Level2(lsList):
print('\nL2',lsList)
print('......-*')
retList = []
for i in range(1,17):
tmp = lsList[0:]
if(i != lsList[6]):
tmp[6] = i
retList.append(tmp)
return retList

def Level3(lsList):
print('\nL3',lsList)
print('.....*-.')
retList = []

leftList = [] #save numbers that can be used
lsList6 = lsList[0:6]
for i in range(1,34):
if(i not in lsList6):
leftList.append(i)

lsList5 = [] #save lists which contain 5 numbers in lslist
for i in range(0,len(lsList)-1):
lsListBak = lsList[0:]
lsListBak.remove(lsList[i])
lsList5.append(lsListBak)

for i in lsList5:
for j in leftList:
tmp = i[0:5]
tmp.append(j)
tmp.sort()
retList.append(tmp)
retList.sort()
for i in retList:
i.append(lsList[6])
return retList

def Level4_1(lsList):
retList = []
retListL3 = Level3(lsList)
for i in range(1,17):
if(i != lsList[6]):
for j in retListL3:
tmp = j[0:]
tmp[6] = i
retList.append(tmp)
retList.sort()
return retList
def Level4_2(lsList):
retList = []
lsListLeft = lsList[0:6]
#get all C(6,4)
lsList6_4 = []
lsList6_2 = []
for i in range(0,5):
for j in range(i+1,6):
tmpList = [lsListLeft[i],lsListLeft[j]]
lsList6_2.append(tmpList)
for i in lsList6_2:
tmpList = lsListLeft[0:]
tmpList.remove(i[0])
tmpList.remove(i[1])
lsList6_4.append(tmpList)
#get all C(27,2)
lsList27 = []
for i in range(1,34):
if(i not in lsListLeft):
lsList27.append(i)
lsList27_2 = []
for i in range(0,26):
for j in range(i+1,27):
tmpList = [lsList27[i],lsList27[j]]
lsList27_2.append(tmpList)
#get all C(6,4) and C(27,2)
for i in lsList6_4:
for j in lsList27_2:
tmpList = i[0:]
tmpList.append(j[0])
tmpList.append(j[1])
tmpList.sort()
tmpList.append(lsList[6])
retList.append(tmpList)
retList.sort()
return retList
def Level4(lsList):
print('\nL4',lsList)
retList = []
print('.....*-*')
retList4_1 = Level4_1(lsList)
print('....**-.')
retList4_2 = Level4_2(lsList)
for i in retList4_1:
retList.append(i)
for i in retList4_2:
retList.append(i)
retList.sort()
return retList

def Level5_1(lsList):
retList = []
retList4_2 = Level4_2(lsList)
for i in range(1,17):
if(i != lsList[6]):
for j in retList4_2:
tmp = j[0:]
tmp[6] = i
retList.append(tmp)
retList.sort()
return retList
def Level5_2(lsList):
retList = []
lsListLeft = lsList[0:6]
#get all C(6,3)
lsList6_3 = []
for i in range(0,4):
for j in range(i+1,5):
for k in range(j+1,6):
tmpList = [lsListLeft[i],lsListLeft[j],lsListLeft[k]]
lsList6_3.append(tmpList)
#get all C(27,3)
lsList27 = []
for i in range(1,34):
if(i not in lsListLeft):
lsList27.append(i)
lsList27_3 = []
for i in range(0,25):
for j in range(i+1,26):
for k in range(j+1,27):
tmpList = [lsList27[i],lsList27[j],lsList27[k]]
lsList27_3.append(tmpList)
#get all C(6,3) and C(27,3)
for i in lsList6_3:
for j in lsList27_3:
tmpList = i[0:]
tmpList.append(j[0])
tmpList.append(j[1])
tmpList.append(j[2])
tmpList.sort()
tmpList.append(lsList[6])
retList.append(tmpList)
retList.sort()
return retList
def Level5(lsList):
print('\nL5',lsList)
retList = []
print('....**-*')
retList5_1 = Level5_1(lsList)
print('...***-.')
retList5_2 = Level5_2(lsList)
for i in retList5_1:
retList.append(i)
for i in retList5_2:
retList.append(i)
retList.sort()
return retList

def Level6_1(lsList):
retList = []
#get all C(6,2)
lsListLeft = lsList[0:6]
lsList6_2 = []
for i in range(0,5):
for j in range(i+1,6):
tmpList = [lsListLeft[i],lsListLeft[j]]
lsList6_2.append(tmpList)
#get all C(27,4)
lsList27 = []
for i in range(1,34):
if(i not in lsListLeft):
lsList27.append(i)
lsList27_4 = []
for i in range(0,24):
for j in range(i+1,25):
for k in range(j+1,26):
for l in range(k+1,27):
tmpList = [lsList27[i],lsList27[j],lsList27[k],lsList27[l]]
lsList27_4.append(tmpList)
#merge C(6,2) and C(27,4)
for i in lsList6_2:
for j in lsList27_4:
tmpList = i[0:]
tmpList.append(j[0])
tmpList.append(j[1])
tmpList.append(j[2])
tmpList.append(j[3])
tmpList.sort()
tmpList.append(lsList[6])
retList.append(tmpList)
retList.sort()
return retList
def Level6_2(lsList):
retList = []
#get all C(6,1)
lsListLeft = lsList[0:6]
lsList6_1 = []
for i in range(0,6):
tmpList = [lsListLeft[i]]
lsList6_1.append(tmpList)
#get all C(27,5)
lsList27 = []
for i in range(1,34):
if(i not in lsListLeft):
lsList27.append(i)
lsList27_5 = []
for i in range(0,23):
for j in range(i+1,24):
for k in range(j+1,25):
for l in range(k+1,26):
for m in range(l+1,27):
tmpList = [lsList27[i],lsList27[j],lsList27[k],lsList27[l],lsList27[m]]
lsList27_5.append(tmpList)
#merge C(6,1) and C(27,5)
for i in lsList6_1:
for j in lsList27_5:
tmpList = i[0:]
tmpList.append(j[0])
tmpList.append(j[1])
tmpList.append(j[2])
tmpList.append(j[3])
tmpList.append(j[4])
tmpList.sort()
tmpList.append(lsList[6])
retList.append(tmpList)
retList.sort()
return retList
def Level6_3(lsList):
retList = []
lsListLeft = lsList[0:6]
#get all C(27,6)
lsList27 = []
for i in range(1,34):
if(i not in lsListLeft):
lsList27.append(i)
lsList27_6 = []
for i in range(0,22):
for j in range(i+1,23):
for k in range(j+1,24):
for l in range(k+1,25):
for m in range(l+1,26):
for n in range(m+1,27):
tmpList = [lsList27[i],lsList27[j],lsList27[k],lsList27[l],lsList27[m],lsList27[n]]
lsList27_6.append(tmpList)
#merge C(27,6)
for j in lsList27_6:
tmpList = []
tmpList.append(j[0])
tmpList.append(j[1])
tmpList.append(j[2])
tmpList.append(j[3])
tmpList.append(j[4])
tmpList.append(j[5])
tmpList.sort()
tmpList.append(lsList[6])
retList.append(tmpList)
retList.sort()
return retList
def Level6(lsList):
print('\nL6',lsList)
retList = []
print('..****-.')
retList6_1 = Level6_1(lsList)
print('.*****-.')
retList6_2 = Level6_2(lsList)
print('******-.')
retList6_3 = Level6_3(lsList)
for i in retList6_1:
retList.append(i)
for i in retList6_2:
retList.append(i)
for i in retList6_3:
retList.append(i)
retList.sort()
return retList

if __name__=='__main__':
lsList = [1,2,3,4,5,10,6]

####################################
retList1 = Level1(lsList)
print('L1 count:',len(retList1))
retList1.append(['count',len(retList1)])
SaveToCSV(retList1,'Level1.csv','w')

####################################
retList2 = Level2(lsList)
print('L2 count:',len(retList2))
retList2.append(['count',len(retList2)])
SaveToCSV(retList2,'Level2.csv','w')

####################################
retList3 = Level3(lsList)
print('L3 count:',len(retList3))
retList3.append(['count',len(retList3)])
SaveToCSV(retList3,'Level3.csv','w')

####################################
retList4 = Level4(lsList)
print('L4 count:',len(retList4))
retList4.append(['count',len(retList4)])
SaveToCSV(retList4,'Level4.csv','w')

####################################
retList5 = Level5(lsList)
print('L5 count:',len(retList5))
retList5.append(['count',len(retList5)])
SaveToCSV(retList5,'Level5.csv','w')

####################################
retList6 = Level6(lsList)
print('L6 count:',len(retList6))
retList6.append(['count',len(retList6)])
SaveToCSV(retList6,'Level6.csv','w')

 

3、说明

本代码当前测试环境为python3.5