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。你会提出什么更好的替代方案?