主要考虑了两种主要的洗牌方式,第一种是将牌随机分成4堆然后打乱重排,这样经过几次重排就能得到打乱的牌。第二种是将牌随机分成两堆,然后将其中一堆每张间隔一个塞进另一堆中形成打乱的牌。
方法一
首先我们用1到52这组整数代表一副扑克牌,以其整除4的余数代表四种花色。用runstest函数检测数组是否已经可以看作随机。若随机,函数返回0,否则返回1.用o作为洗牌不随机的数量,循环10000次查看结果。
clear;
o=0;
for p=1:10000 %循环10000次
a=1:52;
for i=1:100 %切牌100次
x=fix(rand()*52); %生成随机数将牌分段
b=a(1:x);
r=fix(rand()*(52-x)+x);
c=a(x+1:r);
p=fix(rand()*(52-r)+r);
d=a(r+1:p);
g=a(p+1:52);
a=[g,d,c,b]; %再重新打乱组合
end;
if(runstest(a)) %检测是否随机
o=o+1;
end
end
o
当不断切分并重新组合100之后,循环10000次得到不随机的牌数量为300左右。
影响结果的主要指标是将牌切分的数量。我只切分为4份,要达到随机需要循环很多次。还有就是重新组合的方式是固定的,没有使用更随机的方法。
方法二
第二种方法是将牌分为两堆然后每隔一张从一堆中按顺序插入另一堆之中,两堆的数量随机。比较多的一堆在另一队插牌完之后直接跟在后面。同样使用runstest检测并计数,这种方法只要循环10次就能打到10000次仅有300左右不随机的情况,所以判断方法二更有效率。
clear;
o=0;
for t=1:10000 %循环10000次
a=1:52;
for q=1:10 %一次洗牌对插10次
x=fix(rand()*51+1);%随机分成两堆
g=a(1:x);
d=a(x+1:52);
if x<=26 %如果后一堆牌多
for i=0:x-1
a(2*i+1)=g(i+1);
a(2*i+2)=d(i+1);
end
a=[a(1:2*x),d(x+1:52-x)];
else %如果前一堆牌多
for i=0:51-x
a(2*i+1)=d(i+1);
a(2*i+2)=g(i+1);
end
a=[a(1:104-2*x),g(53-x:x)];%多余的部分直接跟在后面
end
end
if(runstest(a)) %检测
o=o+1;
end
end
o
洗牌结束,用两种洗牌方式都可以得到取13张牌最有可能的组合是4432.代码如下:
clear;
for j=1:10000
a=1:52;
a=xipai_u(a); %调用洗牌函数
s=0;t=0;h=0;k=0;
for n=1:13 %取牌并根据余数计数
c=a(n);
if mod(c,4) ==1
s=s+1;
elseif mod(c,4)==2
t=t+1;
elseif mod(c,4)==3
h=h+1;
elseif mod(c,4)==0
k=k+1;
end;
end;
i=[s,t,h,k];
i=sort(i); %排序
b(j)=i(1)*1000+i(2)*100+i(3)*10+i(4);
end;
hist(b,10000) %画出分布
猜对手的牌花色分布
根据自己手中的牌花色分布来推测对方手中的牌可能的花色分布。首先还是用1到52这些数字代表一副扑克牌。指定模4余1到余4分别代表黑桃(spade)、方片(diamond)、红桃(heart)和梅花(club)。先输入自己手中花色的分布,然后相应的从52个数之中去掉对应个数的数字。接着洗牌再抽取13张观察花色分布。代码如下:
clear;
a(1)=input('please input your pokers number:spade= ');
a(2)=input('diamond=');
a(3)=input('heart=');
a(4)=input('club=');
t=1:52;
for i=0:a(1)-1 %将对应个数的数字置0
t(4*i+1)=0;
end
for i=0:a(2)-1
t(4*i+2)=0;
end
for i=0:a(3)-1
t(4*i+3)=0;
end
for i=0:a(4)-1
t(4*i+4)=0;
end
o=0;
for i=1:52
if t(i)>0
o=o+1;
l(o)=t(i);5将不为0的数字转移到另一个数组
end
end
l=xipai_u(l); %用修改后的洗牌函数洗牌
s=0;t=0;h=0;k=0;
for n=1:13 %取13张观察
c=l(n);
if mod(c,4) ==1
s=s+1;
elseif mod(c,4)==2
t=t+1;
elseif mod(c,4)==3
h=h+1;
elseif mod(c,4)==0
k=k+1;
end;
end
[s,t,h,k] %得到分布
根据不同的输入给出的推测不同。若给定自己手中花色分布,再进行循环计数可得到另外三个人手中最有可能的花色分布类型。