在C++中获得均匀分布的随机整数的标准方法是什么?

And*_*eas 10 c++ random

是否有一个函数可以在某个指定范围内获得均匀分布的伪随机整数?我可以使用自己编写的函数rand,但这似乎是一个常见的情况,在STL中可能存在一些东西.

bet*_*ido 15

Boost为随机数生成提供了许多工具.对于统一分布,你有这个:

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';
}
Run Code Online (Sandbox Code Playgroud)

  • 它们现在是**C++ 11**的一部分,因此它们是标准的. (5认同)

Mr.*_*C64 10

要在C++中生成伪随机数,一个非常好的选择是使用Mersenne twister伪随机数生成器引擎:std::mt19937<random>头部开始.

我们可以把这个引擎想象成一个黑色的盒子,它会喷出高质量的随机位.

然后,将这些随机比特可以被成形在使用一些整数输出分配 ; 特别地,为了获得均匀分布的伪随机数,std::uniform_int_distribution可以使用a.

请注意,必须使用种子初始化引擎对象.
std::random_device可用于此目的.

因此,这个过程可以归纳为三个逻辑步骤:

  1. 创建一个实例std::random_device,以获取Mersenne扭转引擎的非确定性种子.
  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;
}
Run Code Online (Sandbox Code Playgroud)

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

rand() 认为有害