C++11 引入了头文件 <random>
带有随机数引擎和随机分布的声明。太好了 - 是时候替换 rand()
的那些用途了这通常以各种方式存在问题。但是,如何替换似乎远非显而易见
srand(n);
// ...
int r = rand();
根据声明,似乎可以像这样构建统一分布:
std::default_random_engine engine;
engine.seed(n);
std::uniform_int_distribution<> distribution;
auto rand = [&](){ return distribution(engine); }
这种方法似乎相当复杂,而且我肯定不会记得与使用 srand()
不同。和 rand()
.我知道 N4531但即便如此,似乎仍然涉及很多。
是否有一种相当简单的方法来替换 srand()
和 rand()
?
最佳答案
Is there a reasonably simple way to replace srand() and rand()?
完全披露:我不喜欢 rand()
.这很糟糕,而且很容易被滥用。
C++11 随机库填补了长期以来一直缺乏的空白。高质量随机库的问题在于它们通常难以使用。 C++11 <random>
图书馆在这方面向前迈出了一大步。几行代码,我就有了一个非常好的生成器,它的表现非常好,并且可以轻松地从许多不同的分布中生成随机变量。
鉴于上述情况,我对您的回答有点异端。如果 rand()
足以满足您的需求,请使用它。和 rand()
一样糟糕是(而且很糟糕),删除它将代表与 C 语言的巨大突破。只要确保 rand()
的坏处确实足以满足您的需求。
C++14 没有弃用 rand()
;它只弃用了 C++ 库中使用 rand()
的函数.虽然 C++17 可能会弃用 rand()
,它不会删除它。这意味着您还有几年的时间 rand()
消失。当 C++ 委员会最终删除 rand()
时,您很有可能已经退休或切换到另一种语言。来自 C++ 标准库。
I'm creating random inputs to benchmark different implementations of std::sort() using something along the lines of
std::vector<int> v(size); std::generate(v.begin(), v.end(), std::rand);
您不需要加密安全的 PRNG。你甚至不需要 Mersenne Twister。在这种特殊情况下,rand()
可能足以满足您的需求。
更新
有一个很好的简单替换 rand()
和 srand()
在 C++11 随机库中:std::minstd_rand
.
#include <random>
#include <iostream>
int main ()
{
std:: minstd_rand simple_rand;
// Use simple_rand.seed() instead of srand():
simple_rand.seed(42);
// Use simple_rand() instead of rand():
for (int ii = 0; ii < 10; ++ii)
{
std::cout << simple_rand() << '\n';
}
}
函数std::minstd_rand::operator()()
返回 std::uint_fast32_t
.但是,该算法将结果限制在 1 和 231-2 之间(含)。这意味着结果将始终安全地转换为 std::int_fast32_t
(如果 int
的长度至少为 32 位,则为 int
)。
关于c++ - 如何使用 <random> 替换 rand()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32927722/