【发布时间】:2016-05-23 08:39:23
【问题描述】:
我需要在性能关键路径上生成随机布尔值。
我为此编写的代码是
std::random_device rd;
std::uniform_int_distribution<> randomizer(0, 1);
const int val randomizer(std::mt19937(rd()));
const bool isDirectionChanged = static_cast<bool>(val);
但不要认为这是最好的方法,因为我不喜欢static_cast<bool>。
在网上我找到了更多的解决方案
1.std::bernoulli_distribution
2.bool randbool = rand() & 1;开头记得打srand()。
【问题讨论】:
-
std::bernoulli_distribution从我的经验来看很慢。最好的方法是生成unsigned long long(对于x64)并将其位用作布尔值。 -
你需要多少“随机性”?毕竟,您可以只声明未初始化的 int 并返回它的第一位。该值将是“随机的”,但分布未知。
-
@JakubZaverka:这是 undefined 行为 - 不能保证您的程序会正常工作。
-
如果它对性能至关重要,那么您可能希望完全避免使用
bool。如果你有很多信息,这是一种非常稀疏的存储信息的方式,如果它们是随机的,那么它们可能会强调分支预测。这取决于您的代码,但 PRNG 不太可能成为瓶颈。
标签: c++ c++11 random boolean c++14