C++ 什么';这是在C+中获得均匀分布随机整数的标准方法+;?
是否有一个函数可以获得某个指定范围内的均匀分布伪随机整数?我可以使用C++ 什么';这是在C+中获得均匀分布随机整数的标准方法+;?,c++,random,C++,Random,是否有一个函数可以获得某个指定范围内的均匀分布伪随机整数?我可以使用rand编写我自己的函数,但这似乎是一种非常常见的情况,STL中可能有适合它的内容。提供了许多随机数生成工具。 对于均匀分布,您有一个: 编辑:更新以包含新的C++11实现。对于整数的情况,这里有参考: 一个简单的例子是: #include <random> #include <iostream> int main() { std::random_device rd; std::mt1
rand
编写我自己的函数,但这似乎是一种非常常见的情况,STL中可能有适合它的内容。提供了许多随机数生成工具。
对于均匀分布,您有一个:
编辑:更新以包含新的C++11实现。对于整数的情况,这里有参考:
一个简单的例子是:
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 6);
for(int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
#包括
#包括
int main()
{
std::随机_装置rd;
标准:mt19937 gen(rd());
标准:均匀分布分布图(1,6);
对于(int n=0;n在C++中生成伪随机数,一个非常好的选择是使用<强>伪随机数生成器引擎<强>:<强> >代码> STD::MTS1973<强> >从<代码> /COD>头。
我们可以把这个引擎看作是一个黑匣子,可以输出高质量的随机位
然后,这些随机位可以在使用分布输出的一些整数中成形;特别是,为了获得均匀分布的伪随机数,可以使用std::uniform_int_分布
请注意,引擎对象必须使用种子进行初始化。
std::random_设备可用于此目的
因此,这个过程可以概括为三个逻辑步骤:
创建std::random_device
的实例,以获取Mersenne twister引擎的非确定性种子
创建std::mt19937
引擎的实例,以获取高质量的伪随机位
使用std::uniform_int_distribution
将这些随机位塑造成均匀分布的整数
可编译C++代码如下:
#include <iostream> // for console output
#include <random> // for pseudo-random number generators and distributions
int main()
{
// Use random_device to generate a seed for Mersenne twister engine.
std::random_device rd;
// Use Mersenne twister engine to generate pseudo-random numbers.
std::mt19937 engine(rd());
// "Filter" MT engine's output to generate pseudo-random integer values,
// **uniformly distributed** on the closed interval [0, 99].
// (Note that the range is [inclusive, inclusive].)
std::uniform_int_distribution<int> dist(0, 99);
// Generate and print 10 pseudo-random integers
for (int i = 0; i < 10; ++i)
{
std::cout << dist(engine) << ' ';
}
std::cout << std::endl;
}
#包含//用于控制台输出
#包括//用于伪随机数生成器和分布
int main()
{
//使用random_设备为Mersenne捻线机引擎生成种子。
std::随机_装置rd;
//使用Mersenne twister引擎生成伪随机数。
标准:mt19937发动机(rd());
//“过滤”MT引擎的输出以生成伪随机整数值,
//**均匀分布**在闭合区间[0,99]。
//(请注意,范围为[包含,包含]。)
标准:均匀分布区(0,99);
//生成并打印10个伪随机整数
对于(int i=0;i<10;++i)
{
std::cout使用std::generate\n
和boost
生成一个或指定数量的整数域上均匀分布的随机变量:
#include <iostream>
#include <algorithm>
#include <boost/random.hpp>
/*
*
*/
int main(int argc, char** argv) {
boost::mt19937 rand_generator(std::time(NULL));
boost::random::uniform_int_distribution<> int_distribution(0, 100);
//Need to pass generator
std::cout << int_distribution(rand_generator) << std::endl;
//Associate generator with distribution
boost::random::variate_generator<boost::mt19937&,
boost::random::uniform_int_distribution<>
> int_variate_generator(rand_generator, int_distribution);
//No longer need to pass generator
std::cout << int_variate_generator() << std::endl;
std::generate_n( std::ostream_iterator<int>(std::cout, ","), 3, int_variate_generator);
return 0;
}
#包括
#包括
#包括
/*
*
*/
int main(int argc,字符**argv){
boost::mt19937随机发生器(std::time(NULL));
boost::random::uniform_int_分布int_分布(0100);
//需要通过发电机吗
太好了!现在他们是C++ 11的一部分,所以它们是标准的。@ K-Balo太棒了!C++ 11使C++变得更容易:+1确实花了一段时间,但这最终被合并了。你可能想编辑你的问题,表明这是合并的一部分,以及对OP的评论,以便他们理解为什么这个新答案会出现在一个旧日期。我不知道为什么每个人都说Mersenne Twister如此伟大和“高质量”。不是。它很复杂,占用了大量内存,而且仍然无法通过TestU01 BigCrush测试套件的多次测试。今天有几种更简单、更快、质量更高的PRNG,具有足够的周期。@plasmacel:我问过Stephan T.Lavavej(VC STL维护人员)他确认这是最好的标准PRNG。你会提出什么更好的替代方案?