我使用以下代码在 C++ 中生成随机数
std::random_device rdev {};
std::default_random_engine generator {rdev()};
std::uniform_int_distribution dist {a, b};
同理
std::default_random_engine generator {std::random_device{}()};
std::uniform_int_distribution dist {a, b};
我想了解的是使用种子值生成引擎背后的机制。 random_device 使用操作系统中的各种信息获取种子。该值用于初始化引擎对象。对于此处显示的第一段代码,如果 rdev
是一个对象,为什么我们将该值作为 rdev()
传递给引擎。为什么我们要在类的对象上使用函数符号?
对于第二段代码,我们如何能够仅使用类名生成一个std::random_device
对象?
我不确定我在理解这方面的问题是特定于随机数生成还是涉及 C++ 语言本身的更大问题。
最佳答案
std::random_device
对象本身不用作种子。 random_device
是一个真随机数生成器。调用它的括号运算符从中产生一个样本。不幸的是,生成真随机数往往比生成伪随机数更昂贵,因此作为折衷方案,人们倾向于生成单个真随机数作为种子传递给伪随机生成器。因此,在您的第一个示例中,random_device
通过调用其括号运算符 (rdev()
) 进行一次采样,返回一个用作种子的真正随机值对于 std::default_random_engine
对象。
第二个例子做了完全相同的事情,除了在这种情况下 random_device
是一个临时的。在 C++ 中,您可以通过直接调用类的构造函数来构造临时对象,在这种情况下使用大括号初始化。换句话说,表达式 std::random_device{}
返回一个临时的、默认构造的 random_device
对象,然后像前面的示例一样调用其括号运算符以产生一个种子。
关于c++ - 使用 std::random_device 在 C++ 中生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45425115/