《编程珠玑》有一题,需要生成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-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;}