C++ 在main和before变量声明之外调用srand

C++ 在main和before变量声明之外调用srand,c++,class,object,random,C++,Class,Object,Random,我需要在我的程序中使用rand(),但问题是它是在类上调用的,我创建的对象需要在全局范围内,所以我需要在main和全局范围之前调用srand(),有办法吗 #include <stdlib.h> #include <iostream> #include <time.h> #include "Electron.h" srand(time(0)); Electron el1; Electron el2; Electron el3; Electron el;

我需要在我的程序中使用rand(),但问题是它是在类上调用的,我创建的对象需要在全局范围内,所以我需要在main和全局范围之前调用srand(),有办法吗

#include <stdlib.h>
#include <iostream>
#include <time.h>
#include "Electron.h"

srand(time(0));
Electron el1;
Electron el2;
Electron el3;
Electron el;


int main(int argc, char** argv){
    ...
}
#包括
#包括
#包括
#包括“Electron.h”
srand(时间(0));
电子el1;
电子el2;
电子el3;
电子发射;
int main(int argc,字符**argv){
...
}

在相同翻译单元中声明的全局范围对象将按照声明顺序构造。因此,您可以声明一个存根类,并让它的构造函数调用
srand
()


但是,不同转换单元中全局作用域对象的构造顺序是未指定的,因此只能保证在这种情况下,在构造此转换单元中的全局作用域之前将调用
srand()
,并且您无法保证其他翻译单元中全局范围对象的构造顺序。

为了确保在调用
兰德
之前已调用
,无论在哪个翻译单元中,您都可以执行以下操作:

auto my_rand()
    -> int
{
    static bool const dummy = (srand( time( 0 ) ), true);
    return rand();
}
这里,
dummy
将在
my\u rand
的第一次调用中初始化一次

class invoke_srand {
public:
     invoke_srand()
     {
         srand(time(0));
     }
};

static invoke_srand do_invoke_srand;

Electron el1;
Electron el2;
Electron el3;
Electron el;
所以只需使用
my_rand
,而不是直接使用
rand


其他消息:

  • 全局变量是邪恶的™.
    它们引入了看不见的数据流和影响线,使人们很难理解程序中发生了什么

  • C++11引入了比rand更好的随机生成器
    
    然而,它们更复杂。我连名字都记不清了,我得查一下。但我想如果你在做模拟的话,你会发现这是值得的

  • 时间是一个不好的熵源。
    来自
    的高分辨率时钟会更好。否则,对于在大致相同的时间(一秒钟内)开始的跑步,您可能会使用相同的种子


您不需要为此定义类(如果需要清理,那将是另一回事)。例如,
bool const dummy=(srand(time(0)),true)。这样做确实浪费了一字节宝贵的RAM。的确,RAM比以前便宜多了,但我讨厌看到宝贵的字节被浪费。没有浪费,这是你的误解。因此,类是一个过早的优化。更糟糕的是,这是一个无法解决问题的过早优化,因为想象中的问题并不存在。谢谢,但我不能在Electron类上调用我的随机变量,还是我错了?你不能在该类上调用它。这不是一个有意义的短语。你从那个类的代码中调用它。