C++ 在main和before变量声明之外调用srand
我需要在我的程序中使用rand(),但问题是它是在类上调用的,我创建的对象需要在全局范围内,所以我需要在main和全局范围之前调用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;
#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类上调用我的随机变量,还是我错了?你不能在该类上调用它。这不是一个有意义的短语。你从那个类的代码中调用它。