0

私はプログラミングにかなり慣れていないので、ソリューションは単純である必要があります。私がしなければならないことは、8x8 マトリックスを生成することです。後でそれを使用するため、すべての要素を 0 に設定する必要があります。次に、20 個の要素をランダムに選択する必要があります (同じものを 2 回) し、それらの要素を 1 に変更します。私が今持っているものでは、通常、毎回 15 から 18 個の「1」を出力します。2回から5回の繰り返しを意味します。それ自体は私には奇妙に一貫しているように見えるので、私が見逃しているもっと大きなものがあるに違いないと思います. 可能な要素をランダム化し、そのリストから選択することについて話している同様の他の投稿を見たことがありますが、それを行うために必要なコードは、この時点で少し頭を悩ませています。

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

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");
    }
4

2 に答える 2

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");
}
于 2016-07-10T18:54:47.060 に答える
0

rand()%8ご存じのように、 foraとの両方の行で常に 0 ~ 7 の値を返します。bそのため、(6,6) のように 2 回返されることがあります。反復回数が 5 回まで拡大するのは、20 回しか反復していない場合は少し奇妙です。しかし、あなたもうまくやっていることがわかるのは2回だけです。

これを試すことができます

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

または、ピッチパーフェクトになりたい場合は、 ( a, b) のペアのリストを作成し、元のコードがペアを生成するたびに、それをリストと照合して一意かどうかを確認し、リストに追加するだけですループカウンターをインクリメントします。

于 2016-07-10T18:56:46.533 に答える