gpt4 book ai didi

c++ - 在实践中应该实际使用 的哪个随机数引擎? std::mt19937?

转载 作者:行者123 更新时间:2023-12-01 08:57:36 28 4
gpt4 key购买 nike

假设你想使用 C++ <random>实用程序中的设施(对于“实用”的某些定义——这里的约束是这个问题的一部分)。你的代码大致如下:

int main(int argc, char **argv) {
int seed = get_user_provided_seed_value(argc, argv);
if (seed == 0) seed = std::random_device()();
ENGINE g(seed); // TODO: proper seeding?
go_on_and_use(g);
}

我的问题是,你应该使用什么类型的 ENGINE ?
  • 我以前总是说std::mt19937因为它打字很快,而且有名字识别。但这些天似乎是everyone's saying Mersenne Twister 非常重量级且对缓存不友好,甚至没有通过其他人所做的所有统计测试。
  • 我想说std::default_random_engine因为这是显而易见的“默认”。但我不知道它是否因平台而异,我不知道它在统计上是否有任何好处。
  • 由于现在每个人都在 64 位平台上,我们至少应该使用 std::mt19937_64std::mt19937 ?
  • 我想说pcg64xoroshiro128因为它们看起来很受人尊敬和轻量级,但它们在 <random> 中不存在根本。
  • 我对 minstd_rand 一无所知, minstd_rand0 , ranlux24 , knuth_b等——他们肯定对某事有好处吗?

  • 显然,这里有一些相互竞争的限制。
  • 发动机的强度。 ( <random> 没有加密强的 PRNG,但是,一些标准化的 PRNG 仍然比其他的“弱”,对吗?)
  • sizeof引擎。
  • 其速度operator() .
  • 易于播种。 mt19937众所周知,很难正确播种,因为它有太多要初始化的状态。
  • 库供应商之间的可移植性。如果一个供应商的 foo_engine产生与另一个供应商的 foo_engine 不同的数字,这对某些应用程序不利。 (希望这排除了除了 default_random_engine 之外的任何情况。)

  • 尽你所能权衡所有这些限制,你认为最终的“保持标准库内的最佳实践”答案是什么?我应该继续使用 std::mt19937 , 或者是什么?

    最佳答案

    C++ Reference列出当前由 C++ 提供的所有随机引擎。但是,引擎的选择还有很多不足之处(例如,请参阅我的列表 high-quality random generators)。例如:

  • default_random_engine是实现定义的,因此不知道引擎是否存在应用程序可能关心的统计缺陷。
  • linear_congruential_engine实现线性同余生成器。但是,除非模数是质数且非常大(至少 64 位),否则它们的质量往往很差。此外,他们不能承认比他们的模数更多的种子。
  • minstd_rand0minstd_rand只承认大约 2^31 个种子。 knuth_b包裹一个 minstd_rand0并对其进行 Bays-Durham 洗牌。
  • mt19937mt19937_64如果它们被更好地初始化(例如,通过初始化 std::seed_seq 的多个输出 random_device 而不仅仅是一个),可以允许更多的种子,但它们使用大约 2500 字节的状态。
  • ranlux24ranlux48使用大约 577 位状态,但它们很慢(它们通过保留一些并丢弃其他伪随机输出来工作)。

  • 但是,C++ 也有两个引擎可以包装另一个引擎以潜在地改善其随机性属性:
  • discard_block_engine丢弃给定随机引擎的一些输出。
  • shuffle_order_engine实现给定随机引擎的 Bays-Durham shuffle。

  • 例如,例如,可能有 mt19937 的 Bays-Durham 洗牌。 , ranlux24 ,或自定义 linear_congruential_engineshuffle_order_engine .或许包装好的引擎质量比原版好。但是,如果没有 testing it,很难预测新引擎的统计质量。 .

    因此,在进行此类测试之前,似乎 mt19937是目前 C++ 标准中最实用的引擎。然而,我知道至少有一个提议将另一个随机数引擎添加到 C++ 的 future 版本中(参见 C++ paper P2075)。

    关于c++ - 在实践中应该实际使用 <random> 的哪个随机数引擎? std::mt19937?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60133647/

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