2017-09-19 17 views
1

printRandom()関数を実装しようとしています。この関数は、配列Cからランダムなエントリを繰り返し選択して削除し、配列Cの中に印刷されている。それらはそれぞれ1回のみ印刷できます。整数の配列をC++で繰り返さずにランダムな順序で出力する

私はcstdlibとiostreamしか使用できません。これは、私が働いている主な機能である

void printRandom(int C[], int n, int seed) { 
srand(seed); 
int test[10] = { 21,-34,2,-42,89,24,11,4,13,-18 }; 

for (int i = 0; i < 10; i++) 
{ 
    int r = rand() % 10; 
    for (int j = 0; j < 10; j++) { 
     if (r != C[j]) { 
      C[i] = test[r]; 
      cout << C[i] << ' '; 
     } 
    } 

} 
} 

:これは、これまでの機能のための私のコードである今、私は数字の大きなブロックを取得しています

int main() { 
    int A[10], B[10] ; 

    A[0] = 21 ; 
    A[1] = -34 ; 
    A[2] = 2 ; 
    A[3] = -42 ; 
    A[4] = 89 ; 
    A[5] = 24 ; 
    A[6] = 11 ; 
    A[7] = 4 ; 
    A[8] = 13 ; 
    A[9] = -18 ; 

    for (int i=0 ; i < 10 ; i++) { 
    B[i] = A[i] ; 
    } 
    printRandom(B,10,38173410) ; 

    for (int i=0 ; i < 10 ; i++) { 
    B[i] = A[i] ; 
} 
    printRandom(B,10,83103131) ; 

for (int i=0 ; i < 10 ; i++) { 
    B[i] = A[i] ; 
} 
    printRandom(B,10,77192102) ; 

return 0 ; 
} 

-34 -34 -34 -34 -34 -34 -34 -34 -34 -34 24 24 24 24 24 24 24 24 24 24 13 13 13 13 13 13 13 13 13 13 89 89 89 89 89 89 89 89 89 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 2 2 2 2 2 2 2 2 2 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 4 4 4 4 4 4 4 4 4 4 13 13 13 13 13 13 13 13 13 13 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -34 -34 -34 -34 -34 -34 -34 -34 -34 -34 2 2 2 2 2 2 2 2 2 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 4 4 4 4 4 4 4 4 4 4 11 11 11 11 11 11 11 11 11 11 -34 -34 -34 -34 -34 -34 -34 -34 -34 -34 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 21 21 21 21 21 21 21 21 21 21 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 13 13 13 13 13 13 13 13 13 13 -34 -34 -34 -34 -34 -34 -34 -34 -34 -34 89 89 89 89 89 89 89 89 89 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 13 13 13 13 13 13 13 13 13 13 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 13 13 13 13 13 13 13 13 13 13 89 89 89 89 89 89 89 89 89 89 13 13 13 13 13 13 13 13 13 13 

私はC++の時間をとって、あなたが助けてくれるのか、少なくとも私が正しい方向に向いているのか疑問に思っていました。 ありがとうございました!

+3

私はあなたが[フィッシャーイエーツシャッフル](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffleを)したいと思います。 –

+1

あなたは['std :: random_shuffle'](http://en.cppreference.com/w/cpp/algorithm/random_shuffle)を使うことができます – user463035818

+1

@ tobi303:はい、「私はcstdlibとiostreamしか使用できません。 –

答えて

1

バグの可能性はあるものの、メソッドがかなり効率的ではありません。たとえば、実際にはサイコロを必要としない場合は、最後に不足している要素を見つけるために乱数を何度も繰り返します。

すでに使用されているインデックスを追跡する場合は、この「インデックスが有効になるまで再ロールする」のを避けることができます。擬似コードで:

void printRandom(int C[], int n, int seed) { 

    D = C; 
    size = n; 

    for i = 1:n { 
      x = rand( [0... size) ); 

      print element at D[x] 

      D[x] = D[size-1]; 

      size--; 
    } 
} 
関連する問題