gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:41:26 32 4
gpt4 key购买 nike

根据this使用 std::random_device 发布后,直观的播种可能不会产生预期的结果。特别是,如果使用 Mersenne Twister 引擎,则无法达到所有初始化状态。使用 seed_seq 也无济于事,因为它不是双射。

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

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

所以问题是:我应该如何正确地为 std::default_random_engine 播种,以便它能够满足我的期望?

最佳答案

一个 uniform_int_distribution 仍然是统一的,但是你播种它。但更好的播种可以减少获得相同均匀分布值序列的机会。

我认为对于大多数用途而言,使用 std::seed_seq 和来自 std::random_device 的大约 8 个随机 32 位整数应该就足够了。由于您链接的帖子中给出的原因,它并不完美,但是如果您出于加密目的需要真正安全的数字,则无论如何都不应该真正使用伪随机数生成器:

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

关于c++ - 我应该如何正确播种 C++11 std::default_random_engine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44030912/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com