【问题标题】:rand() keeps returning 0rand() 不断返回 0
【发布时间】:2015-10-05 08:13:17
【问题描述】:

我正在使用 Visual Studio 2010 并使用 C 进行编程。我试图通过 rand() 方法生成一个随机整数值。代码如下:

/*main.cpp*/
int main (void)
{
    InitBuilding();

    return 0;
}

/*building.cpp*/
//includes
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//data structure
typedef struct
{
    int type;   //building type
} BUILDING;

//global variables
BUILDING g_aBld[200];

//initialization
void InitBuilding(void)
{
    srand((unsigned)time(NULL));

    for(int cntBld = 0; cntBld < 200; cntBld++)
    {  
         g_aBld[cntBld].type = (rand() % 3);
    }
}

经过调试,我意识到循环的每次迭代都会不断生成 0。我之前在其他程序中使用过这个确切的代码,它工作得很好。我不知道为什么它现在不起作用。 提前感谢您的任何回复。

【问题讨论】:

  • 请提供一个简短但完整的示例来演示该问题——我们可以编译并运行该示例以重现该问题。
  • @Thomas OP 没有将 srand() 调用放入循环中。所以它不是重复的。
  • 你能澄清一下是rand()还是rand()%3给出的结果为0?
  • @Thomas 这根本不是真的,rand() 不是基于时钟的。
  • 您是如何确认的?这适用于我的编译测试g_aBld。在优化构建中,这可能不会被视为填充数组

标签: c random


【解决方案1】:
     g_aBld[cntBld].type = (rand() % 3);

不要使用 mod 来缩小rand 的范围,因为这会与随机数生成器自身初始化的方式产生不良的互操作性。试试,例如:

     g_aBld[cntBld].type = rand() / (RAND_MAX / 3);

【讨论】:

  • 感谢您的回复!不幸的是,您提供的代码似乎不适用于我的程序。我已经确认 rand() 函数本身的行为很奇怪,而不仅仅是 (rand() % 3)。关于为什么方法本身不能正确运行的任何想法?
  • 给我们足够的代码,以便我们可以编译和运行它。你从rand() 看到了什么返回值?
  • 明白。我已经编辑了我的原始帖子以包含调用 InitBuilding() 函数的主函数。 rand() 中的所有值都为零,无论范围跨度如何。
  • 这无法说明从rand 返回的值。所以我们仍然不知道你是如何确定它返回零的。您是否尝试将g_aBld[cntBld].type = (rand() % 3); 更改为printf("rand=%d\n", rand());
【解决方案2】:

项目编译后添加了

int main( int argc, char ** argv )
{
    InitBuilding();
}

添加此代码后,代码可以生成 0、1、2 类型

【讨论】:

  • 原始帖子不是 MCVE。它没有调用该函数来设置数据。从 main 调用函数,rand 返回的值每次都不同,并正确设置数组中的值类型。
  • 你的意思是你可以在 Visual Studio 中运行没有main 函数的程序吗?
猜你喜欢
  • 2023-03-28
  • 2017-09-13
  • 2010-11-04
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多