2

使用这个程序,我试图将一个 6x15 数组设置为 0,然后在数组的随机槽中放置一个随机数 x 次。然而,事情并没有按计划进行……

注意 MAX_ROWS 为 6,MAX_COLS 为 15,OCEAN 为 0

#include <stdio.h>
#include <time.h>
#include "util.h"

int rand_number(int param);

main()
{
int map[MAX_ROWS][MAX_COLS]; //initializes an array, map, with the dimensions 6 and 15.

//sets all values in the array to 0
int a,b;

for (a = 0; a < MAX_ROWS; a++)
{
for (b = 0; b < MAX_COLS; b++)
{map[a][b]=OCEAN;}
}

int shipnum = 6;

这应该放置随机数。(shipnum 只是我用来限制我放置的船只数量的值):

while(shipnum > 0)
{
map[rand_number(MAX_ROWS)][rand_number(MAX_COLS)] = 3;
shipnum -= 1;
map[rand_number(MAX_ROWS)][rand_number(MAX_COLS)] = 2;
shipnum -= 2;
map[rand_number(MAX_ROWS)][rand_number(MAX_COLS)] = 1;
shipnum -= 3;
}

但是,当我跑步时

/*This will print the array*/
for (a = 0; a < MAX_ROWS; a++)
{
for (b = 0; b < MAX_COLS; b++)
{printf("%d ", map[a][b]);}
printf("\n");
}
}

我被给

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

当我真的想得到类似的东西时

0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 2 0 0 0 0 0 3 0 0 
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 

这是我用来生成随机数的函数。

/*This will generate a random number*/
int rand_number(int param)
{
srand((unsigned int)time(NULL));
int x = param;
int rn = rand() % x;
return rn;
}
4

4 回答 4

3

每次调用时rand_number,都使用 重置伪 rng srand((unsigned int)time(NULL));,删除该行或将其移动到 main() 的开头

不要在程序中多次调用 srand() ,在程序启动时的某个地方。

根据您要执行的操作,请记住随机数生成器不会产生唯一数字,因此如果您想保证已shipnum在数组中放置条目,则可能需要考虑这一点。即您对 rand_number() 的 6 次调用都可能产生 4 个。

于 2012-05-04T11:02:08.763 回答
2

您在每次通话时都重新播种随机生成器,这将使其不是随机的。删除这一行:

srand((unsigned int)time(NULL));

您的代码还允许在已经有船的地方编写船。如果您不想允许这样做,则应在将船放入该单元之前检查该单元是否为空。

int x = rand_number(MAX_ROWS);
int y = rand_number(MAX_COLS);
if (map[x][y] == 0) {    /* Add this check! */
    map[x][y] = 1;
    shipnum -= 1;
}
于 2012-05-04T11:01:46.243 回答
0

除了不多次调用 srand() 之外,您将不会使用您拥有的 while 循环获得所需的输出。你说你想要总共 6 艘船,1、1、1、2、2、3,但是你的 while 循环放置了每种类型的一个,之后你的shipnumwill == 0,让你脱离循环。

相反,创建三个独立的船舶放置例程,每种类型一个。此外,您需要确保您的位置不在另一艘船的顶部——这正是您在随机函数中快速调用 srand() 时发生的情况,并且在其他时间也可能发生。

于 2012-05-04T11:08:37.983 回答
0

让我印象深刻的第一件事是,您没有检查现有单元是否已经分配了一艘船。我会使用 0 作为哨兵值。

另外(自从我使用随机数以来已经有一段时间了),我敢打赌你的种子有问题。我相信计算机太快了,您的功能无法成功,这意味着您用作种子的“时间”总是相同的。

将种子设为外部(在函数体外部声明),并初始化一次。

于 2012-05-04T11:10:29.563 回答