0

我对编程很陌生,所以解决方案需要简单。我需要做的是生成一个 8x8 矩阵,并且由于我稍后将使用它,我需要将所有元素设置为等于 0。然后,我需要随机选择 20 个元素(不选择相同的两次)并将这些元素更改为 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正如您可能知道的那样,将始终在您的两行中返回 0-7 的值ab所以它可能会像 (6,6) 一样返回两次。当您仅迭代 20 次时,将重复次数放大到 5 确实有点奇怪。但只有两次表明你也做得很好。

你可以试试这个

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

或者,如果您想要完美音高,请列出 ( a, b) 对,每次原始代码生成一对时,将其与列表匹配以查看它是否唯一,然后只需将其添加到列表中并增加你的循环计数器。

于 2016-07-10T18:56:46.533 回答