在 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
将始终在 a
和 b
的两行中 return 取值 0-7。所以它可能 return 喜欢 (6,6) 两次。当您仅迭代 20 次时,重复次数增加到 5 确实有点奇怪。但只有两次表明你也做得很好。
你可以试试这个
a=rand()%8;
b=(a+(i%8))%8;
或者,如果你想做到音高完美,请列出 (a
,b
) 对,每次你的原始代码生成一对时,你将它与列表匹配看看它是否是唯一的,然后只有你将它添加到列表中并增加你的循环计数器。
我是编程新手,所以解决方案必须简单。我需要做的是生成一个 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
将始终在 a
和 b
的两行中 return 取值 0-7。所以它可能 return 喜欢 (6,6) 两次。当您仅迭代 20 次时,重复次数增加到 5 确实有点奇怪。但只有两次表明你也做得很好。
你可以试试这个
a=rand()%8;
b=(a+(i%8))%8;
或者,如果你想做到音高完美,请列出 (a
,b
) 对,每次你的原始代码生成一对时,你将它与列表匹配看看它是否是唯一的,然后只有你将它添加到列表中并增加你的循环计数器。