我应该如何正确播种C ++ 11 std :: default_random_engine?

时间:2017-05-17 17:01:37

标签: c++ c++11 random

根据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播种,以便它能够完成我的期望?

1 个答案:

答案 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 };
}