尝试在数组中生成一定数量的随机放置的数字

时间:2012-05-04 10:57:50

标签: c arrays random placement

使用这个程序,我试图将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 个答案:

答案 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作为哨兵值。

此外(自从我使用随机数字已经有一段时间了),我打赌你的种子出了问题。我相信计算机太快,你的功能无法成功,这意味着你用作种子的'时间'总是一样的。

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