最近在学习概率论。用概率计算日常工作、学习、生活发生一些现象,不仅可以提高我们学习概率的兴趣,也可以帮助我们了解平时习以为常的一些事情的概率,不断提高数学思维,不断提高将数学应用到生产、生活中的能力。 此游戏规则是是一副牌52张,去掉大小王。每个人按顺序摸取一张后下一个人接着摸取一张,直至每个人手上有三张牌为止。牌面点数的大小,按如下规则进行: 三张相同点数>同色顺子>同色非顺子>不同色顺子>对子>非对子 1.采用公式计算三张相同的点数出现的概率 ,不考虑抽取样本的顺序,计算从m个总体中抽出n个产品,存在多少种抽法。如果在只一个人抽样的情况,抽取三张相同点数的概率计算如下: 第一步:计算52张牌中任意抽取3张,=22100种方法。 第二步:抽取三张相同的牌面的方法:先从取13个点数中选取1点,共有13种方法,然后再在这个点数4张牌中任意选择3张,故有13*4=52 第三步:三张相同的点数牌面的概率是52/22100=0.235%。 通过上述计算,说明在随机抽样的情况下,1个人连续抽1000次可以得到2次三张相同点面的牌面。这个抽样计算的是一个人抽完三张牌后,重新将牌放入整副牌后再抽的概率,每一次抽样的开始,总是52张牌。那么,在每次抽完后不放入牌中,继续在剩下的牌中开始下一轮,直到整副牌抽完,那三张相同的点数牌面的概率又是多少呢?如果有四个人按顺序摸牌,拿到三张相同的点数牌面的概率又是多少呢?对于上面问题,如果进行纯手工计算似乎是一个挑战。 本例采用python模拟发牌过程,四个人、每个人拿三张牌,如果最后牌数不够四个人完整拿到三张牌,就重全部重新洗牌,作了新了一轮开始。此次程序进行了10000轮,每轮4个回合的运行模拟,得到前五种牌面出现的概率。模拟运行得到的三张相同点数的概率0.248%与计算的结果0.235%基本一致。 三张相同点数的概率:396/(10000*4*4)=0.248% 同色顺子的概率:0.197% 同色非顺子的概率:4.938% 不同色顺子的概率:3.209% 对子的概率:17.23%。 程序如下: import random import re round_turn=10000 #程序运行1000次 three_p=0 three_color=0 three_sq=0 three_colo_sq=0 paries=0 for lot in range(round_turn): "define poker list" poker=[] "three_p=0" #'Generat r1-13' color=("R","B","S","F") #表示,红、黑、方、梅" for k in color: poker.append([k+str(i) for i in range(1,14)]) 'Transfer 2 demension to 1 dimension' poker=sum(poker,[]) 'random the poker sequence' random.shuffle(poker) 'random select one piece' 'define players' player_n=4 players={} n_poker_turn=3 #pices of each one poker_l=len(poker) while poker_l/(n_poker_turn*player_n)>=1: for i in range(1,player_n+1): players[i]=[] poker_l=len(poker) #while poker_l>=4: while n_poker_turn: for i in players: sel_poker=random.sample(poker, k=1) poker=list(set(poker)-set(sel_poker)) players[i].append(sel_poker) n_poker_turn-=1 for i in players: # sort the card players[i].sort() # covert 2 dimension list to 1 dimension player_cov="".join(sum(players[i],[])) # select the number player_cov1=re.findall(r"\d+\.?\d*",player_cov) # string list convert to numeric list player_cov1 = list(map(int, player_cov1)) player_cov1.sort() # if the 3 pcs of points are same: if max(player_cov1)==min(player_cov1): three_p+=1 #selct the letters player_cov2=re.findall(r'\D',player_cov) player_cov2.sort() #define 3pcs are same color if max(player_cov2)==min(player_cov2): #define if they are in sequence if int(player_cov1[1])-int(player_cov1[0])==1 and int(player_cov1[2])-int(player_cov1[1])==1 or player_cov1==[1,12,13]: three_colo_sq+=1 # define the there same color else: three_color+=1 elif int(player_cov1[1])-int(player_cov1[0])==1 and int(player_cov1[2])-int(player_cov1[1])==1 or player_cov1==[1,12,13]: three_sq+=1 else: if int(player_cov1[1])-int(player_cov1[0])==0 or int(player_cov1[2])-int(player_cov1[1])==0: paries+=1 poker_l=len(poker) n_poker_turn=3 print("%s roundturn ,for 3 pcs points are same: %s times"%(round_turn,three_p)) print("%s roundturn,for 3 color&sqeunce are same: %s times"%(round_turn,three_colo_sq)) print("%s roundturn,3 colors are same: %s times"%(round_turn,three_color)) print("%s roundturn,3 sqeunce are same: %s times"%(round_turn,three_sq)) print("%s roundturn,2 paries are same: %s times"%(round_turn,paries))