題:.給出洗牌的一個算法,並將洗好的牌存儲在一個整形數組裡。
分析:54張牌分別用0到53的數值表示並存儲在一個整形數組裡,數組下標(即初始數值)代表紙牌所在的位置,如boke[0]的值即為0。這樣做便於知道最終元素換到了哪個位置,例如最終boke[3]的值為7,則知道是7號位的元素換位到3號位。接下來,遍歷整個數組,在遍歷過程中隨機產生一個隨機數,並以該隨機數為下標的數組元素與當前遍歷到的數組元素進行對換。
代碼如下:
01 #include<iostream>
02 #include<cstdlib>
03 #include<ctime>
04 using namespace std;
05
06 void shuffle(int boke[]) //洗牌
07 {
08 int i,r,t;
09 srand((unsigned)time(NULL));
10 //加上此句則每次所得到的隨機數均不再相同,否則重新執行程序,所得隨機數保持不變
11 for(i=1; i<54; i++)
12 {
13 r=rand()%(54-i)+i;
14 //第一次生成隨機數范圍為1至53,第二次為2至53,然後依次類推
15
16 //交換
17 t=boke[i-1];
18 boke[i-1]=boke[r];
19 boke[r]=t;
20 }
21 }
22
23
24 int main(){
25 int boke[54],i;
26 for(i=0;i<54;i++) //初始化紙牌
27 boke[i]=i;
28
29 cout<<"before shuffle:"<<endl;
30 for(i=0; i<54; i++) //打印
31 cout<<boke[i]<<" ";
32 cout<<endl;
33
34 shuffle(boke); //洗牌
35
36
37 cout<<"after shuffle:"<<endl;
38 for(i=0; i<54; i++) //打印
39 cout<<boke[i]<<" ";
40 cout<<endl;
41 system("pause");
42 return 0;
43 }