现在的位置: 首页 > 综合 > 正文

洗牌问题

2013年12月13日 ⁄ 综合 ⁄ 共 2044字 ⁄ 字号 评论关闭
洗转52张牌

vc2003,gcc4-2.3测试

RAND_MAX定义大小window和linux不同

方法一:随机取0-51,依次存放,用状态数组判断是否重复

  1. #include <stdlib.h>
  2. #include <time.h>
  3. #include <stdio.h>
  4. #define POKE_NUM (1000000) 
  5. void ruffle()
  6. {
  7.   int poke[POKE_NUM];//存放扑克牌
  8.   int poke_stat[POKE_NUM];//存放已选扑克牌状态
  9.   
  10.   int get;
  11.   int i;
  12.   //初始化
  13.   for (i=0; i<POKE_NUM; i++)
  14.     {
  15.       poke[i] = 0;
  16.       poke_stat[i] = 0;
  17.     }
  18.   //播下随机种子
  19.   srand( (unsigned)time( NULL ) );
  20.   
  21.   long start = time(NULL); 
  22.   for (i=0; i<POKE_NUM; i++)
  23.     {
  24.       //取随机数0-51
  25.       get = rand() % POKE_NUM;
  26.       //如果状态数组中为1, 则丢弃,i不计数
  27.       if (poke_stat[get] == 1)
  28.     {
  29.       i--;
  30.       continue;
  31.     }
  32.       //得到不重复的牌赋给数组,并且置位状态
  33.       else
  34.     {
  35.       poke[i] = get;
  36.       poke_stat[get] = 1;
  37.       printf("%d: %d/n ", i, poke[i]);
  38.     }
  39.     }
  40.   long end = time(NULL);
  41.   //打印
  42.   // for (i=0; i<POKE_NUM; i++)
  43.   // {
  44.   // printf("%d ", poke[i]);
  45.   // }
  46.   printf("/n time: %ld/n", (end-start));
  47. }
  48. int main(int argc, char* argv[])
  49. {
  50.   ruffle();
  51.   return 0;
  52. }

缺点是越到最后,随机数重复的概率越高。

方法二:
初始化一副扑克牌,将随机数作为索引,每次取出一张牌与最后一张牌互换,随机范围可逐渐缩小,并且保持连续。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define POKE_NUM (1000000) 
  5. void ruffle()
  6. {
  7.   int poke[POKE_NUM];//存放扑克牌
  8.   //int poke_stat[POKE_NUM];//存放已选扑克牌状态
  9.   
  10.   int index;
  11.   int i;
  12.   //初始化
  13.   for (i=0; i<POKE_NUM; i++)
  14.     {
  15.       poke[i] = i;
  16.       //poke_stat[i] = 0;
  17.     }
  18.   //播下随机种子
  19.   srand( (unsigned)time( NULL ) );
  20.   
  21.   long start = time(NULL); 
  22.   int temp;
  23.   for (i=0; i<POKE_NUM; i++)
  24.     {
  25.       //取随机索引,每次减一
  26.       index = rand() % (POKE_NUM-i);
  27.       temp = poke[POKE_NUM - i - 1];   //从右往左换
  28.       poke[POKE_NUM - i -1] = poke[index];
  29.       poke[index] = temp;
  30.       //如果状态数组中为1, 则丢弃,i不计数
  31.       // if (poke_stat[get] == 1)
  32.       // {
  33.       // i--;
  34.       // continue;
  35.       // }
  36.       //得到不重复的牌赋给数组,并且置位状态
  37.       // else
  38.       // {
  39.       // poke[i] = get;
  40.       // poke_stat[get] = 1;
  41.       printf("%d: %d/n ", i, poke[POKE_NUM - i -1]);
  42.       // }
  43.     }
  44.   long end = time(NULL);
  45.   //打印
  46.   // for (i=0; i<POKE_NUM; i++)
  47.   // {
  48.   // printf("%d ", poke[i]);
  49.   // }
  50.   printf("/n time: %ld", end-start);
  51. }
  52. int main(int argc, char* argv[])
  53. {
  54.   ruffle();
  55.   return 0;
  56. }

刚写了一遍,提交居然清空了,我!@#$#@$^

抱歉!评论已关闭.