コンパイラがC ++ 0xをサポートし、それを使用することがオプションである場合、新しい標準<random>
ヘッダーがニーズを満たす可能性があります。uniform_int_distribution
最小および最大の境界(必要に応じて含む)を受け入れる高品質であり、さまざまな乱数ジェネレーターから選択して、その分布にプラグインできます。
int
[-57、365]に均一に分散された100万個のランダムs を生成するコードを次に示します。<chrono>
あなたはパフォーマンスがあなたにとって大きな懸念であると述べたので、私はそれを時間を計るために新しいstd 機能を使いました。
#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 1秒あたりの乱数。
コンストラクタに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
)この分布の最初の4つの「モーメント」を計算し(表示されていません)、それらを理論値と比較して、分布の質を定量化しようとしました。
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_
接頭辞は「期待される」を指します)