使用这个程序,我试图将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;
}
答案 0 :(得分:3)
每次拨打rand_number
时,都会使用srand((unsigned int)time(NULL));
重置伪rng,删除该行,或将其移至main()的开头
在程序启动时,不要在程序中调用srand()超过一次。
根据您要执行的操作,请记住随机数生成器不会生成唯一编号,因此如果您要保证已在阵列中放置shipnum
条目,则可能需要考虑这一点。即你对rand_number()的6次调用都可以产生4次。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
除了多次不调用srand()之外,你不会使用while循环获得所需的输出。你说你想要总共6艘船,1,1,1,2,2,3,但是你的while循环放置了每种类型之一,之后你的shipnum
将== 0,打破你走出循环。
相反,创建三个单独的船舶放置例程,每个类型一个。此外,您需要确保您的位置不在另一艘船的顶部 - 这正是您在随机函数中调用()时如此快速调用时发生的情况,并且有可能在其他时间发生。
答案 3 :(得分:0)
首先让我感到震惊的是,你不会检查现有的单元是否已经分配了一艘船。我会用0作为哨兵值。
此外(自从我使用随机数字已经有一段时间了),我打赌你的种子出了问题。我相信计算机太快,你的功能无法成功,这意味着你用作种子的'时间'总是一样的。
将种子设为外部(在函数体外声明它),并初始化一次。