灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3550回复:0

C语言洗牌算法

楼主#
更多 发布于:2012-09-06 12:32


题:.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。
分析: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

喜欢0 评分0
游客

返回顶部