【问题标题】:An attempt to generate a certain amount of randomly-placed numbers in an array尝试在数组中生成一定数量的随机数字
【发布时间】:2012-05-13 22:03:52
【问题描述】:

使用这个程序,我试图将一个 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;
}

【问题讨论】:

  • 这是为新的战舰电影准备的吗?

标签: c arrays random placement


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • 当他使用1 &lt;= x &lt;= param 中的数字来索引数组时,他为什么要它们?
    • 接下来我实际上需要这样做,所以我正在研究这个。谢谢!
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-05
        • 2012-10-17
        • 2018-04-16
        • 2011-09-18
        • 2020-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多