Python不用学,看看你就懂;拿来就能用,用用你就会
无需安装编程软件,把代码拷贝到在线编辑器即可运行
玩牌的时候,缺门要么是一件让人非常高兴的事情,要么是一件令人非常沮丧的事情。因此,你很想知道缺门的概率是多少。
假如有52张牌,4门花色,分别为:S-黑桃、H-红桃、D-方块、C-梅花。
你拿到13张牌,请问至少缺一门花色的概率是多少呢?
缺两门缺三门也要算在里面。由于扣除重复部分的方法比较复杂,这个概率的计算还蛮难的,很可能你和几个同学的思路不一样,算出来的结果也不一样。而且即使我告诉你正确结果,你或者你同学都仍有可能不理解、不同意,所以用Python验证一下是很有意思的。
先说一下正确结果,52张牌4门花色,13张牌至少缺一门花色的概率是:
其中
表示m个不同物体中随机取n个的组合数目。
好了。下面用Python程序验证一下。注意,为了提高计算效率,这里我们不用如何高效而完美地洗牌?中提到的发牌程序,而是巧妙地用随机数的数值大小直接判断获得的是什么花色的牌:
import random
EXP = 100000 # 实验次数
DEAL = 13 # 发牌张数
void = 0 # 缺门计数器
for i in range(EXP):
S1 = H1 = D1 = C1 = 13 # 初始时牌堆每门牌13张
S2 = H2 = D2 = C2 = 0 # 初始时手牌每门牌0张
for i in range(DEAL):
r = random.randint(1,S1+H1+D1+C1) # 产生一个1到剩余牌张总数的随机数
if r <= S1 : # 该随机数指定牌张为黑桃
S1 -= 1 # 牌堆黑桃张数减1
S2 = 1 # 现在手牌里有黑桃了
elif r <= S1+H1 : # 该随机数指定牌张为红桃
H1 -= 1 # 牌堆红桃张数减1
H2 = 1 # 现在手牌里有红桃了
elif r <= S1+H1+D1 : # 该随机数指定牌张为方块
D1 -= 1 # 牌堆方块张数减1
D2 = 1 # 现在手牌里有方块了
else: # 该随机数指定牌张为梅花
C1 -= 1 # 牌堆梅花张数减1
C2 = 1 # 现在手牌里有梅花了
full = S2 + H2 + D2 + C2
if full == 4: break # 四门花色都不缺,无需继续发牌
if full < 4 : void += 1 # 发完牌,如果有缺门,计数器+1
print ("P(void) = %0.1f" %(void/EXP*100),"%")
重复发100000次牌,结果是:
P(void) = 5.1 %
Program ended with exit code: 0
完美验证了前面的理论计算结果!(注意,你运行上述代码的结果可能是5.0%或5.2%,这是因为采用统计计算存在一定误差,精度取决于实验次数。要提高精度,你需要提高几个量级的实验次数,会导致计算时间很长)。
这里是《简单又好玩的Python》栏目,欢迎关注。
源代码文件地址: