[英]Selecting Non-Repeating Random Elements of 2 Dimensional Array in C
我是编程新手,所以解决方案必须简单。 我需要做的是生成一个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");
}
如果生成现有对,您可以插入一个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
两行中返回0-7之间的值。 因此可能会发生两次返回(6,6)的情况。 当您仅迭代20次时,重复次数最多扩展为5确实有点奇怪。 但是只有两次表明您也表现良好。
你可以试试这个
a=rand()%8;
b=(a+(i%8))%8;
或者,如果您想获得完美的音调,则列出( a
, b
)对,然后每次您的原始代码生成一对时,都将其与列表匹配以查看其是否唯一,然后仅将其添加到列表并增加循环计数器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.