我正在使用构造函数中使用rand()的C类.我真的希望这个课程能够在各个方面照顾好自己,但我不确定在哪里播种rand().
如果我在构造函数中播种rand(),那么每次构造一个新的对象类型实例时它都会被播种.因此,如果我按顺序创建3个对象,它们将在同一秒内创建,因此对于rand()具有相同的种子,从而为对象的3个实例中的每个实例生成完全相同的数据.
我想在类代码中播种rand(),而不是在创建对象之前必须在我的程序的main函数中执行它.我想做一个静态布尔种子;变量,表示rand()是否已经播种,但我不确定如何在创建类时将其初始化为false.
我的想法是这样的
myConstructor(){ if(!seeded){ srand(time(NULL)); seeded = true; } myVariable = rand()%maxVal; }
我想如果我能弄清楚如何在程序开始时将静态值初始化为false,那么这将有效.我的理解是,如果对象的所有实例都是静态的,那么将此静态值更改为true将会传递该对象的所有实例,因此只会在第一次创建对象类型时执行种子函数.
解决方法
I think this would work if I could just figure out how to initialize the static value to false a single time at the start of the program.
// my_class.h class my_class { public: // ... private: static bool seeded; }; // my_class.cpp bool my_class::seeded = false;
确保在实现文件中定义种子.否则,包含标头的每个文件都将获得自己的静态成员定义,并且它也可能导致链接器问题,因为它可以多次定义.
另外,如果静态成员是const整数类型,您可以在声明点分配它.
另一个选择就是这个,我个人更喜欢这个任务:
my_class::my_class() { static bool seeded = false; if(!seeded) { srand(time(NULL)); seeded = true; } myVariable = rand() % maxVal; }