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

mar*_*trz 14 c++ random c++11

根据这篇文章,直观播种std::random_device可能不会产生预期的结果.特别是,如果使用Mersenne Twister引擎,则不能达到所有初始化状态.使用seed_seq也不会帮助,因为它不是双射.

据我所知,这一切意味着std::uniform_int_distribution并非真正的统一 - 因为并非所有的种子价值都是可能的.

我想简单地生成几个随机数.虽然这是一个非常有趣的话题,我肯定会把我的一些空闲时间用在一起,但很多人可能没有这种可能性.

所以问题是:我应该如何正确地播种,std::default_random_engine以便它完全符合我的期望?

Chr*_*rew 5

uniform_int_distribution如果种下它,A 仍然是统一的.但是,更好的播种可以减少获得相同序列的均匀分布值的机会.

我认为,对于大多数目的而言,使用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 };
}
Run Code Online (Sandbox Code Playgroud)