boostのメルセンヌツイスタによる乱数とC言語の標準関数の乱数生成速度

比較してみた。
boostをちょこちょこ見始めたところでメルセンヌツイスタが使える事に気がついたのでC言語のrand関数と速度を比較してみた。

include<iostream>
#include<cstdlib>
#include<boost/random.hpp>
#include<boost/progress.hpp>
using namespace std;
using namespace boost;

// C言語の標準関数randとboostのメルセンヌツイスタで
// [0,1)の乱数を生成して時間を計測

void standardRandom()
{
    progress_timer t;

    // 初期化
    srand(time(NULL));

    for (int i = 0; i < 1<<24; i++)
        rand();
}

void MersenneRandom()
{
    progress_timer t;

    // 初期化
    mt19937 gen(static_cast<unsigned long>(time(0)));
    uniform_real<> range(0, 1);
    variate_generator< mt19937&, uniform_real<> > randomValue(gen, range);

    for (int i = 0; i < 1<<24; i++)
        randomValue();
}

int main()
{
    standardRandom();
    MersenneRandom();
    return 0;
}

実行結果

gcc4.0.1で-O3オプション付きでコンパイルした。

0.26 s

0.21 s

結論:boostのメルセンヌツイスタのが早い。
公式サイトにちょっとだけ書いてあった。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/what-is-mt.html