如果您的编译器支持C++0x,并且使用它是一个选项,那么新的标准<random>
头文件可能会满足您的需求。它具有高质量的uniform_int_distribution
,该分布将接受最小和最大边界(根据您的需要包括在内),并且您可以在各种随机数生成器中选择插入到该分布中。
这里是生成一百万个[-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 英特尔Core i5),这将打印出:
每秒生成 2,10268e+07 个随机数。
你可以通过将一个整数传递给它的构造函数来设置生成器的种子:
G g(seed);
如果您后来发现int
不能涵盖您分布所需的范围,可以通过更改uniform_int_distribution
来解决此问题(例如,改为long long
):
typedef std::uniform_int_distribution<long long> D
如果您后来发现minstd_rand
生成器的质量不够高,也可以轻松更换。例如:
typedef std::mt19937 G
将随机数生成器和随机分布的控制分开可以非常自由。
我还计算了这个分布的前四个“矩”(使用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_
前缀表示“期望”的意思。)