C++ 在头文件中使用rand()

C++ 在头文件中使用rand(),c++,C++,我想用三个不同的随机整数填充一个数组 int itemA[3] = {rand() % 20 + 1, rand() % 20 + 1, rand() % 20 + 1}; 目前,我只能种子的随机整数,如果它是在主。有人能告诉我如何在我的数组所在的头文件中种子吗 从目前为止我发现的情况来看,我认为我需要srand(时间(0))在那里,但它只做我希望它做的事情,如果它是在主要方面。这是一个令人惊讶的深刻和重要的问题,如此之多,以至于我的个人资料中提到了它。答案很简单:不要在标题中这样做,即使内联

我想用三个不同的随机整数填充一个数组

int itemA[3] = {rand() % 20 + 1, rand() % 20 + 1, rand() % 20 + 1};
目前,我只能种子的随机整数,如果它是在主。有人能告诉我如何在我的数组所在的头文件中种子吗


从目前为止我发现的情况来看,我认为我需要srand(时间(0))在那里,但它只做我希望它做的事情,如果它是在主要方面。

这是一个令人惊讶的深刻和重要的问题,如此之多,以至于我的个人资料中提到了它。答案很简单:不要在标题中这样做,即使内联变量可以这样做。原因很重要:作为全局状态,种子必须设置一次(请考虑,如果多个头在绘制其“随机”编号之前,每个头都设置了
时间(0)
的种子,则它们通常都会得到相同的结果)

这有一些推论:因为主程序是(根据定义)唯一知道用户意图的部分,所以它应该执行这样的初始化;例如,用户可能希望通过命令行选项指定种子来重现以前的结果。即使你的程序还不支持这样的功能,你也必须有一个源文件来包含
main
,所以你最好在那里播种RNG

您可能会反对您没有编写
main
,或者您根本没有源文件。然而,这仅仅意味着您正在编写一个(可能只是标题)库,这立即意味着对于可组合性,您不能擅自承担初始化的责任(


同样的逻辑也适用于任何其他进程全局参数,如当前工作目录或环境变量。库(以及内部头文件,将其视为微型库)可以提供函数来帮助
操作这些东西(例如,为种子收集熵或向类似环境变量的
路径添加元素),但他们不应该自己采取此类行动。

FWIW,在头文件中定义变量是一个非常糟糕的主意,除非它被标记为
内联
。为什么有数组(声明?)在头文件中,看起来像一个.Stand结构,InIrand {INITRAND(),{SRAND(时间(0));} iTimEa(3)= { RAND()%,20(+),RAND()%,20(+),(和)(%)20 + 1,作为一个旁侧,在C++中,你不使用<代码> RAND()/CUT>(而不是C++的随机生成器)(从<代码>包含< /代码>).它们的质量更好,没有全球性的状态。