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

 

posted on 2013-11-06 19:30  裴银祥的博客园  阅读(341)  评论(0编辑  收藏  举报