【发布时间】:2018-01-16 23:29:22
【问题描述】:
我正在尝试使用 mt19937 引擎和 std::random_device 作为种子源来生成均匀分布的随机数。如果幸运的话,我会从 40 亿个可能的值中得到几十万个唯一数字。我想知道它是否会比这更好。
我尝试使用高分辨率计时器来增加熵,使用 seed_seq (https://stackoverflow.com/a/34493057/5852409) 的随机设备也尝试初始化 mt19937 (https://codereview.stackexchange.com/a/109266) 的所有 624 个状态。但是,没有看到任何改善。
#include <random>
#include <iostream>
#include <set>
void main()
{
std::random_device rd;
std::mt19937 engn(rd());
std::uniform_int_distribution<unsigned int> unidist(0, 0xFFFFFFFF - 1);
std::set<unsigned int> s;
auto itr = s.insert(unidist(engn));
int k = 0;
while (itr.second)
{
itr = s.insert(unidist(engn));
k++;
}
std::cout << k << '\n';
}
【问题讨论】:
-
从分布中生成样本后,范围内任何一个数字的概率为
1/range。包括你刚刚画的数字。因此,据我所知,您提供的代码并没有说明随机数生成器的质量。要查看分布是否真正均匀且没有簇和间隙,您需要运行生成器一段时间,然后执行统计测试以查看这确实是来自均匀分布的样本集的概率。 -
您不能同时拥有唯一数字和随机数字。您生成的唯一数字越多,它们的随机性就越弱。
标签: c++11