重新写的程序。每次洗出一张,放在最后,剩下的牌重新洗,直至最后一张。代码如下:
#include<stdio.h> #include<time.h> int N=54; char * pk[]={"黑桃A","黑桃2","黑桃3","黑桃4","黑桃5","黑桃6","黑桃7","黑桃8","黑桃9","黑桃10","黑桃J","黑桃Q","黑桃K","红桃A","红桃2","红桃3","红桃4","红桃5","红桃6","红桃7","红桃8","红桃9","红桃10","红桃J","红桃Q","红桃K","草花A","草花2","草花3","草花4","草花5","草花6","草花7","草花8","草花9","草花10","草花J","草花Q","草花K","方块A","方块2","方块3","方块4","方块5","方块6","方块7","方块8","方块9","方块10","方块J","方块Q","方块K","大王","小王"}; main() { int a[N]; int i; int temp; int p; int ten=0; unsigned int time1,time2; int m=0; for (i=0;i<N;i++) { a[i]=i; } srand((unsigned)time(NULL)); for (m=0;m<100000;m++){ for (i=N-1;i>0;i--) { temp= rand() % i; p=a[i]; a[i]=a[temp]; a[temp]=p; }} for (i=0;i<N;i++) { printf("%02d:%-5s ",i+1,pk[a[i]]); ten++; if (ten==10) { printf("\n"); ten=0; } } printf("\n"); }
贴图:
在火车上看人打扑克,想做个洗牌算法。我的思路用c语言实现,是这样的:
/*本程序是洗牌算法的c语言实现. 原理是,生成52个随机数;每生成一个,记录在数组中,同时记下该数已经生成.下次再生成随机数,如果 已经成生过,则重新生成一个随机数.生成与否,该信息记录在另一个数组中.例如,如果数字15已经成生,则 array[15]=1; */ #include<stdio.h> #include<time.h> #include<stdlib.h> #define N 52 int poker[N]; //用来记录生成的扑克代码 int back[N]; //用来记录"hash"信息 init_back() { //初始化hash数组 int i=0; for (i=0;i<N;i++) { back[i]=0; } } //辅助函数,用来打印数组,每10个一行. print_array(int * array) { int i=0,m=0; for (i=0;i<N;i++) { printf("%d ",array[i]); if ((i+1) % 10 ==0 && i) { printf("\n"); } } printf("\n"); } //生成随机数. rand_back() { int i=0; int counter=0; //用来测试一共生成了多少次随机数.计算效率. srand((unsigned)time( NULL ) );//用来初始化随机函数,以便生成不同的随机数. for (i=0;i<N;i++) { ++counter; int p=rand()%N; if (!back[p]) { poker[i]=p; back[p]=1; } else { i--; } } printf("the counter is: %d\t,效率是 %f;\n",counter,(52.0/counter)); } int main() { //print_array(poker); init_back(); rand_back(); //print_array(poker); //getchar(); }
生成其中一组随机记录为:
23 8 5 17 48 51 14 49 35 36
38 30 31 24 29 47 34 18 41 11
27 16 26 9 45 43 46 0 3 19
37 13 32 20 6 22 4 33 7 21
40 50 42 1 2 28 39 15 25 12
10 44
不过效率似乎不高。计算所生成的有效随机数与尝试次数之比,结果如下: