乱数列の取得について
珠玉のプログラミングの輪講をしており,乱数を使ったプログラムのベンチマークをRubyでとる時(単に呼び出して実行速度の平均をとるだけ)に遭遇したのでメモ.
乱数の初期化にはseedとしてtime関数による秒数をあたえることが多い.
#include <time.h> ... srand((unsinged)time(NULL));
しかしtimeで取得しているのは秒数なので,そのプログラムが1秒よりも短い時間で終了し,かつ複数回実行させる場合(今回はベンチマークをとる時)では同じseedを渡していることになり,同じ乱数列が取得されてしまう.
そこでもっと短い値を得るためにgettimeofday()関数を用いる.
#include <sys/time.h> ... struct timeval tv; gettimeofday(&tv, NULL); srand(tv.tv_sec + tv.tv_usec);
tv_usecはマイクロ秒が格納されているので短い時間(ミリ秒程度)で動作するプログラム中でも,異なった乱数列を取得できる.