假设我已经或即将编写一组相关函数.假设他们与数学有关.在组织上,我应该:
MyMath命名空间中并通过它们引用它们MyMath::XYZ()MyMath,并将这些方法设为静态,并引用类似的方法MyMath::XYZ()为什么我会选择一个作为组织我的软件的方法?
我似乎看到很多答案,有人建议使用它<random>来生成随机数,通常伴随着这样的代码:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 5);
dis(gen);
Run Code Online (Sandbox Code Playgroud)
通常这会取代某种"邪恶的憎恶",例如:
srand(time(NULL));
rand()%6;
Run Code Online (Sandbox Code Playgroud)
我们可能会批评旧的方式,认为time(NULL)提供低熵,time(NULL)可预测,最终结果是不均匀的.
但所有这一切都适用于新的方式:它只有一个更光亮的贴面.
rd()返回一个unsigned int.这至少有16位,可能是32位.这还不足以为MT的19937位状态提供种子.
使用std::mt19937 gen(rd());gen()(以32位播种并查看第一个输出)不能提供良好的输出分布.7和13永远不会是第一个输出.两粒种子产生0.十二粒种子产生1226181350.(链接)
std::random_device可以(有时是)实现为具有固定种子的简单PRNG.因此,它可能在每次运行时产生相同的序列.(链接)这甚至比time(NULL).
更糟糕的是,尽管存在它们包含的问题,但复制和粘贴上述代码片段非常容易.对此的一些解决方案需要获得可能不适合每个人的大型 库.
鉴于此,我的问题是如何在C++中简洁,便携,彻底地播种mt19937 PRNG?
鉴于上述问题,一个很好的答案:
std::random_device或time(NULL)作为熵的来源.思考