为C类播种rand()

前端之家收集整理的这篇文章主要介绍了为C类播种rand()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用构造函数中使用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;
}

猜你在找的C&C++相关文章