【问题标题】:How to create obiects with random data member values? C++如何创建具有随机数据成员值的对象? C++
【发布时间】:2017-04-24 10:12:34
【问题描述】:

下面代码生成的所有对象都具有相同的 randomNumber1 和 randomNumber2 值。如何正确使用 std::default_random_engine?

#include <random>
#include <iostream>

class Food{

    public:
        int randomNumber1;
        int randomNumber2;
        Food(){
            std::default_random_engine generator;
            std::uniform_int_distribution<int> distribution(1,40);
            std::uniform_int_distribution<int> distribution2(1,30);
            randomNumber1 = distribution(generator) * 20;
            randomNumber2 = distribution2(generator) * 20;
        };
};

int main(){

    Food * food = new Food();
    std::cout << food->randomNumber1 << " " << food->randomNumber2 << std::endl;
    Food * food1 = new Food();
    std::cout << food1->randomNumber1 << " " << food1->randomNumber2 << std::endl;
    Food * food2 = new Food();
    std::cout << food2->randomNumber1 << " " << food2->randomNumber2 << std::endl;

    return 0;
};

【问题讨论】:

    标签: c++ random stl


    【解决方案1】:

    这是因为您每次创建 Food 对象时都会重新播种 engine(使用相同的种子)。你可以做的是把它设为static,这样它只会播种一次:

    static std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(1,40);
    std::uniform_int_distribution<int> distribution2(1,30);
    randomNumber1 = distribution(generator) * 20;
    randomNumber2 = distribution2(generator) * 20;
    

    或者..让调用者决定种子。

    或者,正如 @Unimportant 在 cmets 中所说,使用 std::random_device

    static std::random_device dev;
    static std::default_random_engine generator(dev());
    

    【讨论】:

    • 或者更好的是,将其作为构造函数参数提供。 static... 由来电者决定:)
    • 或使用std::random_device 来获得真正的随机种子。
    • @Unimportant 是的,已添加。
    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 2011-08-15
    • 2019-05-13
    • 1970-01-01
    • 2020-11-29
    • 2017-09-13
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多