-1

我想制作一个程序,它会给我 4 个 1 - 20 范围内的随机数,而它们中的任何一个都不相同。它确实给了我 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以避免这种情况。这段代码是错误的还是我的理解很糟糕?

4

1 回答 1

2

大多数随机数生成器都有重复值的概率。如果他们不这样做,他们的行为将通过各种措施减少随机性。

如果您想要 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 */
 }

wheregen(n)返回一个适当的随机值,其值介于0和之间n-1,可能有重复。

于 2015-09-25T12:34:27.963 回答