什么是对C ++得到均匀分布的随机整数的标准呢?(What's the standard w

2019-06-24 17:16发布

是否有某些特定范围内获得均匀分布的伪随机整数功能? 我可以写用我自己的功能rand ,但是这似乎是一个足够常见的情况,有可能是什么东西在STL它。

Answer 1:

升压为随机数生成的工具。 对于均匀分布你有这样的一个:

http://www.boost.org/doc/libs/1_49_0/doc/html/boost/random/uniform_real_distribution.html

编辑:更新,包括新的C ++ 11的实现。 对于整数的情况下,在这里你有参考:

http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution

一个简单的例子是:

#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';
}


Answer 2:

为了产生在C ++伪随机数,一个非常好的选择是使用梅森捻线机伪随机数发生器引擎std::mt19937<random>头。

我们可以把这个引擎作为一个黑盒子 ,吐出了高品质的随机位

然后,将这些随机比特可以在使用分布一些整数输出被成形 ; 特别是,要得到均匀分布的伪随机数a std::uniform_int_distribution可以使用。

需要注意的是引擎对象必须用种子进行初始化。
std::random_device可以用于这一目的。

所以,这个过程可以概括为三个逻辑步骤:

  1. 创建实例std::random_device ,以获取梅森捻线机非确定性的种子
  2. 创建实例std::mt19937 引擎 ,以获得高品质的伪随机位。
  3. 使用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;
}

有关用C产生伪随机数,更多的细节++(包括原因rand() 不好 ),看到这部影片由斯蒂芬T. Lavavej(从融入本土2013 ):

rand()是有害的



Answer 3:

以产生一个或使用带有上整数域的均匀分布的随机变量的指定数目std::generate_nboost

#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;
}


文章来源: What's the standard way for getting uniformly distributed random integers in C++?
标签: c++ random