乱数列の取得について

珠玉のプログラミングの輪講をしており,乱数を使ったプログラムのベンチマーク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はマイクロ秒が格納されているので短い時間(ミリ秒程度)で動作するプログラム中でも,異なった乱数列を取得できる.