如果您的编译器支持C ++ 0x,并且可以选择使用它,那么新的标准<random>
标头可能会满足您的需求。它具有高质量uniform_int_distribution
,可以接受最小和最大范围(包括您所需要的范围),并且您可以在各种随机数生成器中进行选择以插入该分布。
这是生成int
在[-57,365]中均匀分布的一百万个随机数的代码。我已经使用了新的std <chrono>
工具为它计时,因为您提到性能是您的主要关注点。
#include <iostream>
#include <random>
#include <chrono>
int main()
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::duration<double> sec;
Clock::time_point t0 = Clock::now();
const int N = 10000000;
typedef std::minstd_rand G;
G g;
typedef std::uniform_int_distribution<> D;
D d(-57, 365);
int c = 0;
for (int i = 0; i < N; ++i)
c += d(g);
Clock::time_point t1 = Clock::now();
std::cout << N/sec(t1-t0).count() << " random numbers per second.\n";
return c;
}
对我来说(2.8 GHz Intel Core i5)可以打印出:
每秒2.10268e + 07随机数。
您可以通过将int传递给它的构造函数来为生成器设置种子:
G g(seed);
如果您以后发现int
不满足您的发行范围,则可以通过将此类更改uniform_int_distribution
(例如long long
)来解决:
typedef std::uniform_int_distribution<long long> D;
如果您以后发现minstd_rand
生成器的质量不够高,也可以很容易地将其替换掉。例如:
typedef std::mt19937 G; // Now using mersenne_twister_engine
对随机数生成器具有单独的控制,并且随机分布可以完全解放。
我还计算了(未显示)此分布的前四个“矩”(使用minstd_rand
),并将它们与理论值进行了比较,以试图量化分布的质量:
min = -57
max = 365
mean = 154.131
x_mean = 154
var = 14931.9
x_var = 14910.7
skew = -0.00197375
x_skew = 0
kurtosis = -1.20129
x_kurtosis = -1.20001
(x_
前缀表示“预期”)