《编程珠玑》有一题,需要生成0~10^7的不重复随机数。
最简单最直接的方法是,每次生成一个,然后和已经生成的进行比较,如果有了,那就重新生成。但一个显然的事实是,如果我要产生很多的数,越到后面所要花费的时间将越多。
如何又快又好的产生呢?
我们可以换个角度考虑问题,每次随机产生的可以不是具体的数,而是数在数组中的位置。算法的示意图如下:
#define MAXINT (10000000) void myswap(int &a,int &b); void getRandoms(int k); void myswap(int &a,int &b) { int tmp=a; a=b; b=tmp; } void getRandoms(int k) { int* allint; int i=0; FILE *fp; if(k>MAXINT ||k<=0) return; srand(time(NULL)); allint=(int *)malloc(sizeof(int)*MAXINT); for( i=0;i<MAXINT;i++) { allint[i]=i; } for(i=(MAXINT-1);i>=(MAXINT-k);i--) { myswap(allint[i],allint[rand()%(i+1)]); } if((fp=fopen("data.dat","w+b"))==NULL) { printf("not open"); exit(0); } fwrite(allint+MAXINT-k,sizeof(int),k,fp); fclose(fp); free(allint); } int main(int argc, char* argv[]) { getRandoms(MAXINT); return 0; }