洗转52张牌
vc2003,gcc4-2.3测试
RAND_MAX定义大小window和linux不同
方法一:随机取0-51,依次存放,用状态数组判断是否重复
- #include <stdlib.h>
- #include <time.h>
- #include <stdio.h>
- #define POKE_NUM (1000000)
- void ruffle()
- {
- int poke[POKE_NUM];//存放扑克牌
- int poke_stat[POKE_NUM];//存放已选扑克牌状态
- int get;
- int i;
- //初始化
- for (i=0; i<POKE_NUM; i++)
- {
- poke[i] = 0;
- poke_stat[i] = 0;
- }
- //播下随机种子
- srand( (unsigned)time( NULL ) );
- long start = time(NULL);
- for (i=0; i<POKE_NUM; i++)
- {
- //取随机数0-51
- get = rand() % POKE_NUM;
- //如果状态数组中为1, 则丢弃,i不计数
- if (poke_stat[get] == 1)
- {
- i--;
- continue;
- }
- //得到不重复的牌赋给数组,并且置位状态
- else
- {
- poke[i] = get;
- poke_stat[get] = 1;
- printf("%d: %d/n ", i, poke[i]);
- }
- }
- long end = time(NULL);
- //打印
- // for (i=0; i<POKE_NUM; i++)
- // {
- // printf("%d ", poke[i]);
- // }
- printf("/n time: %ld/n", (end-start));
- }
- int main(int argc, char* argv[])
- {
- ruffle();
- return 0;
- }
缺点是越到最后,随机数重复的概率越高。
方法二:
初始化一副扑克牌,将随机数作为索引,每次取出一张牌与最后一张牌互换,随机范围可逐渐缩小,并且保持连续。
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #define POKE_NUM (1000000)
- void ruffle()
- {
- int poke[POKE_NUM];//存放扑克牌
- //int poke_stat[POKE_NUM];//存放已选扑克牌状态
- int index;
- int i;
- //初始化
- for (i=0; i<POKE_NUM; i++)
- {
- poke[i] = i;
- //poke_stat[i] = 0;
- }
- //播下随机种子
- srand( (unsigned)time( NULL ) );
- long start = time(NULL);
- int temp;
- for (i=0; i<POKE_NUM; i++)
- {
- //取随机索引,每次减一
- index = rand() % (POKE_NUM-i);
- temp = poke[POKE_NUM - i - 1]; //从右往左换
- poke[POKE_NUM - i -1] = poke[index];
- poke[index] = temp;
- //如果状态数组中为1, 则丢弃,i不计数
- // if (poke_stat[get] == 1)
- // {
- // i--;
- // continue;
- // }
- //得到不重复的牌赋给数组,并且置位状态
- // else
- // {
- // poke[i] = get;
- // poke_stat[get] = 1;
- printf("%d: %d/n ", i, poke[POKE_NUM - i -1]);
- // }
- }
- long end = time(NULL);
- //打印
- // for (i=0; i<POKE_NUM; i++)
- // {
- // printf("%d ", poke[i]);
- // }
- printf("/n time: %ld", end-start);
- }
- int main(int argc, char* argv[])
- {
- ruffle();
- return 0;
- }
刚写了一遍,提交居然清空了,我!@#$#@$^