题:.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。
分析: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;
28
29 cout<<"before shuffle:"<<endl;
30 for(i=0; i<54; i++) //打印
31 cout<<boke<<" ";
32 cout<<endl;
33
34 shuffle(boke); //洗牌
35
36
37 cout<<"after shuffle:"<<endl;
38 for(i=0; i<54; i++) //打印
39 cout<<boke<<" ";
40 cout<<endl;
41 system("pause");
42 return 0;
43 }
作者:repaul