- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对 c++11 随机库有点困惑。
我的理解:我们需要两个独立的概念:
我不明白为什么不直接使用真正的随机数生成器:
std::random_device rd;
std::uniform_int_distribution<int> dist(1, 5);
// get random numbers with:
dist(rd);
据我所知,这很好用。
相反,这是我在大多数示例/网站/文章中发现的:
std::random_device rd;
std::mt19937 e{rd()}; // or std::default_random_engine e{rd()};
std::uniform_int_distribution<int> dist{1, 5};
// get random numbers with:
dist(e);
我不是在谈论特殊用途,例如密码学,只是您的基本入门文章。
我的怀疑是因为 std::mt19937
(或 std::default_random_engine
)接受种子,在调试期间提供相同的种子可以更容易调试 session 。
另外,为什么不只是:
std::mt19937 e{std::random_device{}()};
最佳答案
Also, why not just:
std::mt19937 e{std::random_device{}()};
如果您只执行一次可能会很好,但如果您会执行多次,最好跟踪您的std::random_device
而不是不必要地创建/销毁它。
查看 libc++ 源代码以实现 std::random_device
可能会有所帮助,这很简单。它只是 std::fopen("/dev/urandom")
上的一个薄包装.所以每次创建 std::random_device
您将获得另一个文件系统句柄,并支付所有相关费用。
据我所知,在 Windows 上,std::random_device
表示对 Microsoft 加密 API 的一些调用,因此每次执行此操作时都将初始化和销毁一些加密库接口(interface)。
这取决于您的应用程序,但出于一般目的,我不会认为这种开销总是可以忽略不计。有时确实如此,然后这很棒。
我想这与您的第一个问题有关:
Instead, this is what I found on most examples/sites/articles:
std::random_device rd;
std::mt19937 e{rd()}; // or std::default_random_engine e{rd()};
std::uniform_int_distribution<int> dist{1, 5};
至少我是这么想的:
std::mt19937
是一个非常简单可靠的随机发生器。它是独立的,将完全存在于您的进程中,而不需要调用操作系统或其他任何东西。该实现是标准强制,至少在 boost 中,它在任何地方都使用相同的代码,源自原始 mt19937
纸。这段代码非常稳定并且是跨平台的。您可以非常自信地对其进行初始化、查询等操作将在您编译它的任何平台上编译为类似的代码,并且您将获得类似的性能。
std::random_device
相比之下是相当不透明的。你并不确切知道它是什么,它会做什么,或者它的效率如何。你甚至不知道它是否真的可以被获取——当你尝试创建它时它可能会抛出一个异常。你知道它不需要种子。您通常不应该从中提取大量数据,只需使用它来生成种子。有时,它作为加密 API 的一个很好的接口(interface),但实际上并不需要这样做,遗憾的是有时它不需要。它可能对应于 /dev/random
在 unix 上,它可能对应于 /dev/urandom/
.它可能对应于一些 MSVC 加密 API (visual studio),或者它可能只是一个固定常量 (mingw)。如果您为某些手机进行交叉编译,谁知道它会做什么。 (即使您确实得到了 /dev/random
,您仍然会遇到性能可能不一致的问题一致 - 它可能看起来工作得很好,直到熵池用完,然后运行缓慢作为一条狗。)
我的想法是,std::random_device
应该是像 time(NULL)
播种的改进版本-- 这是一个低标准,因为 time(NULL)
考虑到所有因素,它都是一个非常糟糕的种子。我通常在我会使用 time(NULL)
的地方使用它回到过去,产生种子。除此之外,我真的认为它并没有什么用处。
关于c++ - 为什么不直接使用 random_device?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39288595/
我有一个包含两个随机源的类。 std::random_device rd; std::mt19937 random_engine; 我通过调用 std::random_device 为 std::mt
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我需要从不同的 C++ 随机数生成算法中获取数据,为此我创建了一些程序。其中一些使用伪随机数生成器,而另一些使用 random_device(非确定性随机数生成器)。下面的程序属于第二组: #incl
我对 c++11 随机库有点困惑。 我的理解:我们需要两个独立的概念: 随机引擎,可以是: 伪(需要种子)又名 PRNG 真正的随机数生成器 分布:它将从引擎获得的数字映射到特定的区间,使用特定的分布
是否保证 random_device 不会在每个新线程的相同内部状态下启动?那么下面的代码很可能给出两个不同的值? #include #include #include #include us
#include #include using namespace std; int main() { vector coll{1, 2, 3, 4}; shuffle(coll.
我看到很多人一起谈论安全和 std::random_device。 例如,here幻灯片 22。 根据 cppreference , std::random_device : std::random_
根据标准,std::random_device 按以下方式工作: result_type operator()(); Returns: A non-deterministic random value
典型的现代获取随机数的方法是这样的: std::random_device rd; std::mt19937 engine{rd()}; std::uniform_int_distribution<>
我有一些看起来有点像这样的代码: std::random_device rd; #pragma omp parallel { std::mt19937 gen(rd()); #prag
我试着解决这个问题: c++0x_warning.h:32: Fehler:#error This file requires compiler and library support for the
有人知道如何在 ubuntu 上安装 random_device 吗?安装了来自 repo 的所有 boost 包。 我收到的错误是: fatal error :boost/random/random
我尝试运行一个来自 cppreference 的简单示例关于std::random_device , 但在函数调用线上 d(rd1)程序进入无限循环,永不返回。 代码如下: #include #in
我正在使用 std::random_device 并想检查它的剩余熵。根据 cppreference.com: std::random_device::entropy double entropy()
我是 C++ 初学者,我对 C++0x 随机数生成器有疑问。我想使用 Mersenne twister 引擎来生成随机 int64_t 数字,并且我使用我之前找到的一些信息编写了一个函数: #incl
假设我有这个跨平台程序 #include #include int main() { std::random_device rd; std::cout dist(0, 9);
std::random_device 的拷贝构造函数被删除了,我不知道为什么。 我从 docs 中找到的唯一笔记是: 2) The copy constructor is deleted: std::
引自cppreference : std::random_device is a non-deterministic random number engine, although implementa
gcc implementation std::random_device 对我来说似乎很奇怪。具体来说,第 137 行: random_device::result_type random_
我在 Windows 中使用 g++ 和 MinGW 来编译我的 c++ 代码,它看起来像这样: std::mt19937_64 rng(std::random_device{}()); std::u
我是一名优秀的程序员,十分优秀!