c++ - 如何使用 <random> 替换 rand()?

标签 c++ c++11 random

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/

相关文章:

c++ - 针对 Linux 编译时 Assimp aiString 为空

Matlab:如何随机排列和逆排列向量

matlab - 将随机数添加到矩阵 MATLAB

python - 生成总和为 1 的随机变量数组(正数和负数)

android - 创建 .a 文件而不是 .so 使用 android studio?

c++ - 发送字符串时 boost 消息队列崩溃

C++ 模板 - 需要主要表达式

C++ 将简单值转换为字符串

c++ - boost::container::map::emplace() 的piecewise_construct 在哪里?

c++ - 使用迭代函数调用初始化 std::vector