我最近开始学习现代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之间的数字将是非常好的,没有特别的原因。
提前谢谢你。
答案 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处查看它。