程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 洗牌算法

洗牌算法

編輯:關於C語言

題:.給出洗牌的一個算法,並將洗好的牌存儲在一個整形數組裡。
分析: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 }


 

作者:repaul

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved