在 C 中选择二维数组的非重复随机元素

Selecting Non-Repeating Random Elements of 2 Dimensional Array in C

我是编程新手,所以解决方案必须简单。我需要做的是生成一个 8x8 矩阵,并且由于我稍后要用它做的事情,我需要将所有元素设置为 0。然后,我需要 select 20 个元素随机(不选择两次相同的元素)并将这些元素更改为 1。 以我现在所拥有的,我通常每次打印 15 到 18 个“1”。意思是 2 到 5 次重复。这本身对我来说似乎很奇怪,所以我怀疑一定有更重要的东西我错过了。我看过其他类似的帖子,讨论随机化可能的元素,然后从该列表中 selecting,但此时我有点难以理解执行此操作所需的代码。

我的方法有问题吗?

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

您可以插入一个 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");
}
正如您可能知道的那样,

rand()%8 将始终在 ab 的两行中 return 取值 0-7。所以它可能 return 喜欢 (6,6) 两次。当您仅迭代 20 次时,重复次数增加到 5 确实有点奇怪。但只有两次表明你也做得很好。

你可以试试这个

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

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