我应该使用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
答案 0 :(得分:1)
你不能像这样进行比较。你写道:
d(1)==d(2)==d(3)==d(4)
但d(1) == d(2)
评估为逻辑true
或false
。这不等于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个不同的值。