アキラの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
Trackback URL: http://akira-site.net/cgi-bin/mt/mt-tb.cgi/461
コメント
コメントを投稿
カテゴリ「C言語」内の記事
|
シリアルポートの通信 |
乱数の初期化とtime関数 |
ヘッダファイルをコンパイル |
/bin/shを実行するコード |
バッファオーバーフローの確認 |
if文を代用する |
変なswitch文 |
サイト内検索
カテゴリ
- Linux
- Linux Tips [14]
- Linux ソフトウェア [3]
- Web技術
- (X)HTML/CSS [4]
- JavaScript [1]
- MovableType [7]
- その他 [3]
- 各種API [3]
- 各種ツール [4]
- Windows
- Win Tips [3]
- Win ソフトウェア [6]
- コネタ [7]
- プログラミング
- 機器 [4]