是否有一个函数可以在某个指定范围内获得均匀分布的伪随机整数?我可以使用自己编写的函数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)
Mr.*_*C64 10
要在C++中生成伪随机数,一个非常好的选择是使用Mersenne twister伪随机数生成器引擎:std::mt19937从<random>头部开始.
我们可以把这个引擎想象成一个黑色的盒子,它会喷出高质量的随机位.
然后,将这些随机比特可以被成形在使用一些整数输出分配 ; 特别地,为了获得均匀分布的伪随机数,std::uniform_int_distribution可以使用a.
请注意,必须使用种子初始化引擎对象.
std::random_device可用于此目的.
因此,这个过程可以归纳为三个逻辑步骤:
std::random_device,以获取Mersenne扭转引擎的非确定性种子.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;
}
Run Code Online (Sandbox Code Playgroud)
有关用C产生伪随机数,更多的细节++(包括原因rand()是没有好),看到这部影片由斯蒂芬T. Lavavej(从融入本土2013):