gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:32:46 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com