c中的非重复随机数发生器

时间:2015-09-25 11:52:21

标签: random non-repetitive

我想制作一个程序,它会在1到20的范围内给出4个随机数,而不会有任何相同的数字。它确实给了我4个不同的随机数,但每两次尝试2个数字是相同的。我不想要那个。 这是我的代码:

int main(){
int g;
srand(time(0));
start:;
scanf("%d",&g);
switch(g){
case 1:RNG_4_10();
break;
default:exit(0);
break;
}
goto start;
}

int RNG_4_10(){

int a,n,i,c;
for(c=0;c<10;c++){
printf("\n");
for(i=0;i<4;i++){
        a = (rand() % 20 + 1);      //give a random value to a;
        n = a;                      //assign n the value of a;
        while(a == n){
        a = rand() % 20 + 1;                  
        }
        printf("%d\t",a);
}
}
}

另外,我知道RNG有重复数字的概率,理论上它们可以为无穷大产生相同的数字,但我不能得到的是我怎么能有2个相似的数字呢?同样的运行。我添加while来避免这种情况。这个代码是错的还是我的理解很糟糕?

1 个答案:

答案 0 :(得分:1)

大多数随机数生成器都有重复值的概率。如果他们没有采取各种措施,他们的行为将不那么随意。

如果您想要1-20范围内的四个随机值,则创建一个包含所有这些值的20个元素的数组,并在随机数生成器的帮助下对其进行随机播放。然后选择前四个值。

一种常用的混乱技术是(伪代码)

 /*  shuffle an array of n elements */

 for (i = n-1; i > 0; --i)
 {
      swap(array[i], array[gen(n)]);   /*  zero-based array indexing */
 }

其中gen(n)返回值0n-1之间的适当随机值,可能会重复。