2016-07-10 39 views
0

私はプログラミングが新しく、ソリューションは単純である必要があります。私がする必要があることは、8x8行列を生成することです。後でそれを行うため、すべての要素を0に設定する必要があります。次に、要素をランダムに20個選択する必要があります同じものを2回)、それらの要素を1に変更します。 私は今のところ、毎回15〜18 "1"を印刷します。意味は2〜5回繰り返されます。それ自体は私にとって奇妙な一貫性があると思われるので、私は、私が見逃しているより大きなものがなければならないと思う。私は可能性のある要素をランダム化し、そのリストから選択することについて話している他のポストを見てきましたが、それを行うために必要なコードはこの時点で私の頭の中では少ししかありません。Cで2次元配列の非反復ランダム要素を選択

ここに私のアプローチに欠陥がありますか?

int Board[8][8]; 
    int x, y, i, a, b; 
    for (x = 0; x < 8; x++) 
    { 
     for (y = 0; y < 8; y++) 
      Board[x][y] = 0;  //配列の定義 
    } 
     srand(time(NULL));  //任意なマスを1に設定 
     for (i = 0; i < 20; i++) 
     { 
       a = rand() % 8; 
       b = rand() % 8; 

       Board[a][b] = 1; 
     } 
    //盤面の出力 
    for (x = 0; x < 8; x++) 
    { 
     for (y = 0; y < 8; y++) 
      printf(" %d ", Board[x][y]); 
     printf("\n"); 
    } 
+0

コード内で 'srand()'の呼び出しに注意してください。通常はプログラム内で一度だけ呼び出す必要があります。トピックには良いSO Q&Aがありますが、私はSOアプリケーションにブックマークしていません。 –

答えて

1

既存のペアが生成される場合に備えて、乱数生成を繰り返すdo-whileループを挿入できます。以下のような:あなたが知ってできるよう

int Board[8][8]; 
int x, y, i, a = 0, b = 0; 
for (x = 0; x < 8; x++) 
{ 
    for (y = 0; y < 8; y++) 
     Board[x][y] = 0;  //配列の定義 
} 
    srand(time(NULL));  //任意なマスを1に設定 
    for (i = 0; i < 20; i++) 
    { 
      /* Repeat until found a '0'-valued cell*/ 
      do { 
       a = rand() % 8; 
       b = rand() % 8; 
      } while(Board[a][b] == 1); 

      Board[a][b] = 1; 
    } 
//盤面の出力 
for (x = 0; x < 8; x++) 
{ 
    for (y = 0; y < 8; y++) 
     printf(" %d ", Board[x][y]); 
    printf("\n"); 
} 
0

rand()%8は常にabのためのあなたのラインの両方で0-7から値を返します。だから、(6,6)のように2回戻ってくることもあります。繰り返し回数が5回になるまでは、実際に20回以上反復しているときにはちょっと変わってしまいます。しかし、二度だけ良いことをしていることを示しています。

あなたが試すことができ、この

a=rand()%8; b=(a+(i%8))%8;

それとも、ピッチ完璧なもののペアのリスト(ab)し、元のコードがペアを生成するたびにしたい場合は、それをリストと照合して、それが一意であるかどうかを確認し、リストに追加してループカウンタを増やします。

関連する問題