两种洗牌算法比较
// 洗牌算法.cpp : Defines the entry point for the console application. // //算法1原理: /* 1.用一个整型数组记录各个位置是否已经放置了数,如果放置了则不为0,否则为0。所以在算法开始的时候,初始化此数组每个元素的值都为0. 2.每次产生一个0-53之间的数,看这个位置是否放置了数,如果已经放置了,则继续采用同样的方法找一个随机的位置进行判断,如果这个位置还未放置,则设置此位置。 3.反复执行步骤2,直到所有的位置都放好了数。 */ //算法2原理 //先对数组进行初始化,然后随机交换数组中任意两个元素。交换的次数越多就越随机。 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <time.h> void shuffle1(int a[],int num) { int card,pos; for(card=1;card<=num;card++) { do { pos=rand()%(num-1); } while (a[pos]!=0); a[pos]=card; } } void shuffle2(int a[],int num) { for(int i=1;i<=num;i++) a[i-1]=i; int tmp=0,p1,p2; int cnt=1023; while (cnt--) { p1=rand()%num; p2=rand()%num; tmp=a[p1]; a[p1]=a[p2]; a[p2]=tmp; } } int _tmain(int argc, _TCHAR* argv[]) { int a[54]={0}; int b[54]={0}; clock_t start=clock(); shuffle1(a,54); clock_t end=clock(); float time=(float)(end-start)/CLOCKS_PER_SEC; printf("算法1运行时间:%fs\n",time); start=clock(); shuffle2(b,54); end=clock(); time=(float)(end-start)/CLOCKS_PER_SEC; printf("算法2运行时间:%fs\n",time); for(int i=0;i<54;i++) { printf("%d ",a[i]); } printf("\n"); for(int i=0;i<54;i++) { printf("%d ",b[i]); } printf("\n"); system("pause"); return 0; }
补充:软件开发 , C++ ,