确定5张牌扑克手中的4种概率Matlab

时间:2014-09-01 00:39:32

标签: matlab poker

我应该使用Matlab确定5张扑克抽奖中4种概率。 我明白我要做的第一件事就是制作牌组并随机抽牌,然后抽出5张牌。 我无法确定手牌是否是4种。 我已经编写了下面的代码,它适用于洗牌并绘制5张牌。 我试图使用if语句来确定手牌是否是4种,但它不起作用。我在if语句背后的理由是,如果我已经有一个有序的向量,那么唯一的两种可能性是前4个或后4个数字应该彼此相等

实施例。 AAAA_

_2222

关于如何确定4种类型的任何建议都会非常有用:)

DECK = ['AH';'2H';'3H';'4H';'5H';'6H';'7H';'8H';'9H';'TH';'JH';'QH';'KH'; ...
    'AS';'2S';'3S';'4S';'5S';'6S';'7S';'8S';'9S';'TS';'JS';'QS';'KS'; ...
    'AD';'2D';'3D';'4D';'5D';'6D';'7D';'8D';'9D';'TD';'JD';'QD';'KD'; ...
    'AC';'2C';'3C';'4C';'5C';'6C';'7C';'8C';'9C';'TC';'JC';'QC';'KC'];
%deck of 52 cards
total_runs=10000;
n=0;
for i=1:total_runs
  index=randperm(52);
  shuffle=DECK(index);
%shuffles the 52 columns 
  b=shuffle(1:5);
%chooses the first 5 cards
d=sort(b);

 if d(1)==d(2)==d(3)==d(4)||d(2)==d(3)==d(4)==d(5)
   %attempt to determine 4 of a kind
   disp(d);
   n=n+1;
 end
end
 prob=n/total_runs

3 个答案:

答案 0 :(得分:1)

你不能像这样进行比较。你写道:

d(1)==d(2)==d(3)==d(4)

d(1) == d(2)评估为逻辑truefalse。这不等于d(3)

由于它们已经排序,您只需测试

即可
d(1)==d(4) || d(2)==d(5)

答案 1 :(得分:1)

在过去的30分钟里,我一直在为此纠缠不清,我开始怀疑,为什么我们需要指定西装?他可以简单地得到[1到13 ... 1至13],大小为1x52,并使用randperm(52,5)。或如下:

DECK = [1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12 13];
draw = randperm(52,5);
for k = 1:5;
   hand(k) = DECK(draw(k));
end

然后,您可以检查hand()的前两个索引并与hand比较;或:

for i=1:2
   if sum(hand(i)==hand) == 4
      n = n+1;
   end
end

我认为这种方式足够简短,尽管比较列或行值更理想。在第i5代上运行N = 100,000次迭代大约需要1秒。当我将其设置为一千万次迭代时,我获得约0.04%的成功,这比理论上的0.02401%更高。 我的第一次尝试是这样的:

hand = randperm(52,5);
for k=1:5
   match = 0;
   for i=1:3
      if sum(hand(k)+13*i == hand) > 0
         match = match+1;
      end
   end
   if match == 3
      four = four +1;
   end
end
prob = four/N;

我喜欢这一点,因为我不需要用大向量浪费空间;但是,由于15个循环/更多的比较,它需要更多的处理能力。对于此迭代,我在N = 100,000次迭代中获得了约0.024%的成功,这在理论上几乎是零碎的。最内层循环的想法是,当您向其中添加13 * a时,四种类型的卡中的一张等于另一张卡,其中a = 1,2,3。这种方法花了我近一个小时的时间来编写,因为我对循环有所了解。 请让我知道有关代码的任何问题,我们将不胜感激。

edit:哈哈,我刚刚意识到我正在用第一个脚本复制结果。让我们这样做吧:

for i=1:2
   if sum(hand(i)==hand) == 4
      n = n+1;
   end
end

应为:

if sum(hand(1)==hand) == 4
   n = n+1;
elseif sum(hand(2)==hand) == 4
   n = n+1;
end

类似的东西。

答案 2 :(得分:-1)

感谢您发布一个有趣的问题。

我有点发现在MATLAB中使用混合字符串和整数有点笨拙。 但是,如果我们只考虑1到52之间的整数,那么这个问题是可以解决的。

% 1 through 52
% ['AH';'2H';'3H';'4H';'5H';'6H';'7H';'8H';'9H';'TH';'JH';'QH';'KH'; ...
%     'AS';'2S';'3S';'4S';'5S';'6S';'7S';'8S';'9S';'TS';'JS';'QS';'KS'; ...
%     'AD';'2D';'3D';'4D';'5D';'6D';'7D';'8D';'9D';'TD';'JD';'QD';'KD'; ...
%     'AC';'2C';'3C';'4C';'5C';'6C';'7C';'8C';'9C';'TC';'JC';'QC';'KC'];
%deck of 52 cards . . from wikipedia
total_runs=2598960;
n=0;
for i=1:total_runs
  index=randperm(52,5);
  value = mod(index-1, 14);

 if length(unique(value)) == 2
   %attempt to determine 4 of a kind
   n=n+1;
 end
end
 prob=n/total_runs

修改

更正为length(unique(value)) == 2 这给出的概率介于0.1%和0.2%之间。这似乎是合理的。

然而它不应该是mod 13,因为我们想要每种颜色的13个不同的值。