python随机输出52张牌_用Python计算扑克牌缺门概率

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》栏目,欢迎关注。

源代码文件地址:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用rand()函数生成随机数,然后将生成的随机数对52取余数,得到的余数就是一张牌的编号。可以使用一个数组来表示一副扑克牌,然后将数组中的元素随机交换位置,最后将数组分成两份即可。具体代码实现可以参考以下示例: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int poker[52] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52}; int i, j, temp; srand((unsigned)time(NULL)); // 初始化随机数种子 // 洗牌 for (i = ; i < 52; i++) { j = rand() % 52; temp = poker[i]; poker[i] = poker[j]; poker[j] = temp; } // 分牌 int player1[26], player2[26]; for (i = ; i < 26; i++) { player1[i] = poker[i]; player2[i] = poker[i+26]; } // 输出结果 printf("Player 1: "); for (i = ; i < 26; i++) { printf("%d ", player1[i]); } printf("\n"); printf("Player 2: "); for (i = ; i < 26; i++) { printf("%d ", player2[i]); } printf("\n"); return ; } ``` ### 回答2: 扑克牌随机分成两份的方法有很多种,下面我给出一种简单的算法。 首先,创建一副标准的扑克牌,包括52张牌,分别是梅花、红桃、方块和黑桃的2到Ace,即2、3、4、5、6、7、8、9、10、J、Q、K、A。 1. 首先,创建一个数组cards来表示扑克牌,即将所有的牌按顺序放入数组中。 2. 接下来,使用随机数生成器来生成一个0到51之间的随机整数,表示要随机选取的牌的下标。 3. 将选取的牌从数组中取出,放入第一份牌中。可以使用另一个数组hand1来表示第一份牌,将选中的牌加入到hand1数组中。 4. 再次使用随机数生成器生成一个0到51之间的随机整数,表示要随机选取的牌的下标。 5. 将选取的牌从数组中取出,放入第二份牌中。使用另一个数组hand2来表示第二份牌,将选中的牌加入到hand2数组中。 6. 重复步骤4和5,直到将所有的牌都分完为止。 最后,hand1数组中的牌即为第一份牌,hand2数组中的牌即为第二份牌。这样就完成了扑克牌随机分成俩份的过程。 需要注意的是,上述方法是一种简单的随机分牌算法,并不是真正的完全随机。如果需要更加严谨的随机性,可以采用更复杂的算法或使用专门的随机数生成器库。 ### 回答3: 要随机地将一副扑克牌分成两份,可以按照以下步骤进行: 1. 首先,将一副有52张牌扑克牌洗牌,确保牌的顺序是随机的。这可以通过使用C语言中的随机函数来实现。需要注意的是,在开始洗牌之前,需要调用srand函数并以当前时间作为种子,以确保每次生成的随机数序列都是不同的。 2. 然后,创建两个空的扑克牌组,分别用于存储洗牌后的前半部分和后半部分的牌。 3. 使用随机函数生成一个数值范围在0到51之间的随机整数。这个随机数将作为洗牌后的牌堆中取牌的索引。 4. 将洗牌后的牌堆中索引为随机数的牌取出,并将其添加到第一组扑克牌中。 5. 重复步骤3和步骤4,直到第一组扑克牌的数量达到原始牌堆数量的一半。 6. 将剩余的牌全部添加到第二组扑克牌中。 最后,你将会得到两份牌,每份都是随机分配的一半扑克牌
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值