我已经写了一个程序,它应该画一个矩形,并在那个矩形中创建一些随机点。用户将定义矩形的宽度(如X)、长度(如Y)以及他/她想要在矩形中创建的点数(如n)。我在创建点方面有一个问题,我用srand来创建随机点,但它创建的点比它应该创建的少。例如,如果n=3创建了2个点。我以前没用过srand。造成问题的代码如下:
void create_mines(int x,int n)
{
int i, random;
srand(time(0));
for (i = 0; i < n; i++)
{
random = rand() % (x);
board[random][i] = '*';
}
}
怎么了?
发布于 2016-01-20 01:15:37
有一件事你需要考虑的是,你可能会尝试点同一点不止一次,从而“失去一个点”。
您应该检查某个点是否已经点缀,然后再试一次。
此外,你应该确保他们不会要求更多的点是不可能的。
如果这个函数--通常您想确保您的程序只执行一次--我也会将调用移出srand()。
void create_mines(int x, int n) { /* THIS VERSION BROKEN, SEE BELOW */
int i;
int r;
if (n > x) return; /* not possible */
/* do srand() in main */
for (i = 0; i < n; i++) {
do {
r = rand() % (x);
} while (board[r][i] == '*');
board[r][i] = '*';
}
}
如果您的程序(以及我上面的修改)失败,如果n > y
是因为
board[r][i] = '*';
在数组之外(i
太大)。经修订的守则:
void create_mines(int x, int y, int n) {
int i;
int rx;
int ry;
if (n > (x * y)) return; /* more dots than spots for them */
/* do srand() in main */
for (i = 0; i < n; i++) {
do {
rx = rand() % x;
ry = rand() % y;
} while (board[rx][ry] == '*');
board[rx][ry] = '*';
}
}
如果x
*y
和n
是大型,那么这种方法效率低下,而洗牌方法(如上面的注释中所建议的)可能是一种更好的方法。
https://stackoverflow.com/questions/34889834
复制相似问题