【问题标题】:C++: Performance for drawing random boolean valuesC++:绘制随机布尔值的性能
【发布时间】:2019-07-26 21:07:05
【问题描述】:

我正在用

绘制随机布尔数
std::mt19937 rng;
std::uniform_int_distribution<int> dis(0, 1);

在极端情况下,绘制这些数字可能会占用我进程的 CPU 时间的 40%。有什么办法可以加快速度吗?

【问题讨论】:

  • 你可以简单地让你的循环并行。
  • 如何在 0 到 2^64-1 之间绘制一个数字,然后一次使用一个位,连续 64 次,然后再计算另一个随机数?
  • 如果您只需要一个 50/50 随机数生成器,只需使用 rand。它速度很快,而且你没有将它用于任何加密。
  • @Hoodi 循环只是为了表达它将被多次使用,因为这就是我开始对事物进行基准测试的方式。实际上,我的流程不能轻易并行化(或者说它已经是并且不能进一步并行化)
  • 没有循环,我们就缺乏上下文。剩下的两行代码本身不会占用 40% 的 CPU 时间。

标签: c++ random boolean


【解决方案1】:

您可能对@HolyBlackCat 的回答感到满意,但对于此类值的采样,C++ 中支持伯努利分布

顺理成章

std::mt19937 rng{1234567};
std::bernoulli_distribution bd{0.5};

std::cout << bd(rng) << '\n';
std::cout << bd(rng) << '\n';
std::cout << bd(rng) << '\n';

【讨论】:

    【解决方案2】:

    我会摆脱uniform_int_distribution

    一次调用std::mt19937::operator()(即执行rng())将为您提供32个随机位,您可以一个一个地使用它们。

    A benchmark 表明这种方法快了大约 23 倍。

    【讨论】:

    • 也可以应用于不同的范围 (as 15),即使 2 的幂看起来更自然。
    猜你喜欢
    • 2020-09-10
    • 2012-01-15
    • 1970-01-01
    • 2017-09-05
    • 2016-08-13
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多