dSFMT
ちょっと試してみた。
1つのランダム値を求める方法だとそんなにはやくない。せいぜい20%程度の高速化。
乱数を一度に配列にとる関数だと100%程度の高速化。
一度に大量の乱数が必要になる場合に使うのならば、使う価値があるかも。
#include "dSFMT.h" #include <boost/random.hpp> unsigned long long int start_; unsigned long long int end_; int main() { dsfmt_t dsfmt; dsfmt_init_gen_rand(&dsfmt, 0); dsfmt_gv_init_gen_rand(0); asm __volatile__ ("rdtsc" : "=A" (start_)); { double value[10000]; dsfmt_gv_fill_array_open_open(value, 10000); } asm __volatile__ ("rdtsc" : "=A" (end_)); printf("%lld\n", end_ - start_); asm __volatile__ ("rdtsc" : "=A" (start_)); for (int index = 0; index < 10000; ++index) { volatile double value = dsfmt_genrand_open_open(&dsfmt); } asm __volatile__ ("rdtsc" : "=A" (end_)); printf("%lld\n", end_ - start_); boost::mt19937 gen(0); boost::uniform_real<> dist(0, 1); boost::variate_generator< boost::mt19937, boost::uniform_real<> > rand(gen, dist); asm __volatile__ ("rdtsc" : "=A" (start_)); for (int index = 0; index < 10000; ++index) { volatile double value = rand(); } asm __volatile__ ("rdtsc" : "=A" (end_)); printf("%lld\n", end_ - start_); }