我想制作一个程序,它会在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
来避免这种情况。这个代码是错的还是我的理解很糟糕?
答案 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)
返回值0
和n-1
之间的适当随机值,可能会重复。