玖叶教程网

前端编程开发入门

概率学习——对于随机抽取三张牌点数概率的计算

最近在学习概率论。用概率计算日常工作、学习、生活发生一些现象,不仅可以提高我们学习概率的兴趣,也可以帮助我们了解平时习以为常的一些事情的概率,不断提高数学思维,不断提高将数学应用到生产、生活中的能力。

此游戏规则是是一副牌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))

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言