資訊與隨機性洗牌作業

2021-07-06 04:07:31 字數 3033 閱讀 8095

主要考慮了兩種主要的洗牌方式,第一種是將牌隨機分成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;

endend

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);

enda=[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);

enda=[a(1:104-2*x),g(53-x:x)];%多餘的部分直接跟在後面

endend if(runstest(a)) %檢測

o=o+1;

endendo

洗牌結束,用兩種洗牌方式都可以得到取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;

endfor i=0:a(2)-1

t(4*i+2)=0;

endfor i=0:a(3)-1

t(4*i+3)=0;

endfor i=0:a(4)-1

t(4*i+4)=0;

endo=0;

for i=1:52

if t(i)>0

o=o+1;

l(o)=t(i);5將不為0的數字轉移到另乙個陣列

endendl=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] %得到分布

根據不同的輸入給出的推測不同。若給定自己手中花色分布,再進行迴圈計數可得到另外三個人手中最有可能的花色分布型別。

洗牌演算法的隨機性簡單證明。

所謂洗牌演算法,就是產生乙個包含指定範圍的所有數的隨機序列。主流的洗牌演算法的實現如下 對於n張牌,用大小為n的陣列a n for i 0 i我們總是擔心他的隨機性是否能保證,這裡有乙個很簡單的理解。可以先達成乙個共識 如果 1.一張牌出現在任何位置的概率是相等的。2.乙個位置出現任何牌的概率是相等...

flash 與隨機性 隨機抽取

有時候做 程式的時候會經常希望隨機抽取乙個或者多個數,這時候問題就會因此而產生。在一些時間裡面,看了一些資料關於隨機性這個東西其實很有實用價值。不確定性,如隨機數,隨機移動等等。今天做了簡單的實驗,方法不唯一,也有很多更加完善的方法。但目前還是先把知道的記錄下來。題目一 怎樣隨機抽取乙個數?題目二 ...

flash 與隨機性 隨機抽取

有時候做 程式的時候會經常希望隨機抽取乙個或者多個數,這時候問題就會因此而產生。在一些時間裡面,看了一些資料關於隨機性這個東西其實很有實用價值。不確定性,如隨機數,隨機移動等等。今天做了簡單的實驗,方法不唯一,也有很多更加完善的方法。但目前還是先把知道的記錄下來。題目一 怎樣隨機抽取乙個數?題目二 ...