アキラのITメモ:乱数の初期化とtime関数

IT関係、技術関係のメモです。

乱数の初期化とtime関数

とある乱数を使うプログラムを作って、何回か動作させてみたのですが、どうも一定期間同じ出力を出しているようでどうしたものかとソースコードをみていたのですが、srand(time(NULL));とやっていました。乱数のシードを初期化する方法としてはよく以下のような方法が使われるのですが、

#include <time.h>

srand(time(NULL));

ご存知、time関数は1970年1月1日からの経過秒数を秒単位で返す関数で、1秒以内に終わるようなプログラムを何度も実行する場合、同じシードで乱数が初期化されて結果が同じになるという事態が起きるようです。そういうわけで、マイクロ秒単位で取得できるgettimeofdayを使うことで事なきを得ました。

#include <sys/time.h>

struct timeval tv;
gettimeofday(&tv, NULL);
srand(tv.tv_usec);

ちなみに、timevalは/sys/time.hで定義されています。通常、

struct timeval {
    time_t      tv_sec;     /* 秒 */
    suseconds_t tv_usec;    /* マイクロ秒 */
};

らしいですが、cygwinでは

struct timeval {
    long      tv_sec;     /* 秒 */
    long      tv_usec;    /* マイクロ秒 */
};

でした。

カテゴリ: C言語 投稿日: 2007年02月14日 20:37
Trackback URL: http://akira-site.net/cgi-bin/mt/mt-tb.cgi/461

コメント

コメントを投稿





カテゴリ「C言語」内の記事

サイト内検索

カテゴリ

最近のエントリ

関連商品

アバウト

Atom RSS
Powered by MT3.33-ja
合計:total
今日:today 昨日:yesterday