-1

1 から 20 の範囲の 4 つの乱数を同じでなくても与えるプログラムを作成したいと考えています。それは私に4つの異なる乱数を与えますが、2回の試行ごとに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 の範囲の 4 つのランダム値が必要な場合は、これらすべての値を含む 20 個の要素の配列を作成し、乱数ジェネレーターを使用してシャッフルします。次に、最初の 4 つの値を選択します。

シャッフルする一般的な手法は (疑似コードで)

 /*  shuffle an array of n elements */

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

whereは、とgen(n)の間の値を持つ適切なランダム値を返します。場合によっては繰り返します。0n-1

于 2015-09-25T12:34:27.963 に答える