c++ - 使用 std::random_device 在 C++ 中生成随机数

标签 c++ random

我使用以下代码在 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/

相关文章:

c++ - windows下extern函数调用make undefined reference

c++ - 适用于 iOS 的 QtCreator : How to deploy a dylib shared library with my application

c++ - 从函数调用返回后,来自 std::vector 引用的数据损坏

python - 在一个范围内生成 'n'个唯一随机数

java - 为什么我的掷骰子程序卡住了?

c++ - 当我尝试编译我的代码时,出现从 char* 到 char 的转换错误

c++ - 确定二进制文件的大小

java - 如何打印带有随机数的二维数组

c++ - 具有高概率数字的随机)?

R中均匀分布的随机子样本