根据this帖子,http://localhost:8983/solr/techproducts/get?fq=name:realtime-get
{"response":
{"numFound":1,"start":0,"docs":
[ { "id":"mydoc",
"name":"realtime-get test!",
"_version_":1487137811571146752}
]
}
}
的直观播种可能无法产生预期效果。特别是,如果使用Mersenne Twister引擎,则不能达到所有初始化状态。使用seed_seq也不会帮助,因为它不是双射。
据我所知,这一切意味着std::random_device
并非真正统一 - 因为并非所有种子值都是可能的。
我想简单地生成几个随机数。虽然这是一个非常有趣的话题,我肯定会把它放在一些空闲时间,但很多人可能没有这种可能性。
所以问题是:我应该如何正确地为std::uniform_int_distribution
播种,以便它能够完成我的期望?
答案 0 :(得分:5)
uniform_int_distribution
仍然是统一的,但你种下它。但是,更好的播种可以减少获得相同序列的均匀分布值的机会。
我认为在大多数情况下使用来自std::seed_seq
的大约8个随机32位整数的std::random_device
就足够了。它并不完美,因为您链接的帖子中给出的原因,但如果您需要真正安全的数字用于加密目的,您无论如何都不应该使用伪随机数生成器:
constexpr std::size_t SEED_LENGTH = 8;
std::array<uint_fast32_t, SEED_LENGTH> generateSeedData() {
std::array<uint_fast32_t, SEED_LENGTH> random_data;
std::random_device random_source;
std::generate(random_data.begin(), random_data.end(), std::ref(random_source));
return random_data;
}
std::mt19937 createEngine() {
auto random_data = generateSeedData();
std::seed_seq seed_seq(random_data.begin(), random_data.end());
return std::mt19937{ seed_seq };
}