在0-1之间生成随机数以填充容器

时间:2017-03-08 21:22:13

标签: c++ random

我最近开始学习现代C ++,我一直在想。我知道我可以用Mersenne Twister这样创建伪随机数:

std::random_device rnd;
std::mt19937 gen(rnd());
std::uniform_real_distribution<> dist(0.,1.);

所以我找到了算法std::generate(iterator, iterator, generator)所以,我的问题是。有没有办法用这种方法生成0到1之间的随机数并填充容器?

直到现在,我发现如果我举例:

std::generate(v.begin(),v.end(),std::rand); // i know rand() is crap
std::generate(v.begin(),v.end(),gen);

这两个工作正常,但是在0和1之间的数字将是非常好的,没有特别的原因。

提前谢谢你。

2 个答案:

答案 0 :(得分:3)

您无法直接在std::generate中使用该分发,因为operator()需要参数。但是,您可以将生成器和分发捆绑在lambda中,然后使用它。

#include <algorithm>
#include <random>
#include <vector>

int main()
{
    std::random_device rnd;
    std::mt19937 gen(rnd());
    std::uniform_real_distribution<> dist(0.,1.);

    std::vector<double> data(20);

    std::generate(data.begin(), data.end(), [&gen, &dist]() { return dist(gen); });
}

答案 1 :(得分:-2)

以下几行应该有效:

std::generate(v.begin(),v.end(), [] () { return 1.0*std::rand()/RAND_MAX;});

http://ideone.com/vtHK1l处查看它。