【问题标题】:Non repetitive random number generator in cc中的非重复随机数生成器
【发布时间】:2015-09-25 11:52:20
【问题描述】:

我想编写一个程序,它会给我 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 以避免这种情况。这段代码是错误的还是我的理解很糟糕?

【问题讨论】:

    标签: random non-repetitive


    【解决方案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 之间,可能带有重复。

    【讨论】:

    • 对于四个数字,您不必洗牌整个 20 个元素的数组,只需洗牌前四个位置。
    • 不是真正的 rossum。这将无法满足 OP 从一组 20 个值中选择 4 个值的要求。仅洗牌前四个意味着每组选择将包含相同的一组四个值,而不是从可能的 20 个值中选择四个。
    • 您正在将数组gen(n) 中任意位置的随机选择交换到前四个位置中的每一个位置:i = 3、2、1、0。这就足够了。这是 Fisher-Yates shuffle 的标准。
    猜你喜欢
    • 2014-06-10
    • 2011-11-24
    • 1970-01-01
    • 2018-06-25
    • 2014-11-10
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多