「ぎょーむ日誌」目次に戻る | KuboWeb top に戻る | twilog | atom

ぎょーむ日誌 2000-09-06

苦情・お叱りは, たいへんお手数かけて恐縮ですが, 久保 (kubo@ees.hokudai.ac.jp) までお知らせください.

2000 年 09 月 06 日 (水)

	Subject: Re: [ce-ml 71] initialization of random number series.
	Date: Wed, 06 Sep 2000 10:58:50 +0900
(略)
	From: "TAKENAKA, A." <takenaka@nies.go.jp>
	Date: Wed, 06 Sep 2000 09:37:45 +0900

	> (9月5日の「日誌」から)
	> > 「乱数の種」 をシステムクロック で初期化するように Ranu
	> > クラスを変更してみる. システムクロックとは, Unix の場合
	> >  1970 年 1 月 1 日からの経過秒のことで,いま現在だと 9 億
	> >  8617 万秒あたりの値を示す. これを用いると各時刻で異なる
	> > 初期値が得られる. 
	> 
	> 時刻を乱数の種に使うのはよく使われる手ですが,乱数を利用する
	> プログラムが1秒以下で終わってしまうようなごくごく小規模のも
	> のの場合,続けざまに実行すると,同じ時刻が乱数の種となり,同
	> じ乱数系列が発生してしまうことがあります.
蛇足の補足しますと,「同じ乱数系列が発生」問題というのは,ホ ントは毎回毎回デタラメな乱数がいくつか必要なのに,何べんプロ グラムを再実行しても
3→1→4→1→5→9→2→……
というような「決まった順番でデタラメな数がでる」という状態で す.これは上で議論してる「乱数の種」がいつも同じ値であるため に生じる問題です.
	> これを避けるために,私の自作の乱数ライブラリ(C++)では,乱数
	> 発生オブジェクトが廃棄されるときに,最後にひとつ乱数を発生して
	> カレントディレクトリのmyrandom.iniというファイルに書き出してい
	> ます.
	>
	> 乱数発生オブジェクトは,生成時に,このファイルを探しに行き,見
	> つかったらその内容を読み込んで,これと時刻情報の演算で得られる
	> 値を乱数の種にします.こうすれば,0.1秒しかかからないプログラム
	> を繰り返し実行するような場合も大丈夫です.
たしかにこの方法を採用すると上の問題が避けられます.で,じつ はシステムクロックで乱数の種を初期化する,という方法を採用す る前は,この方法使ってました.今回はそれに加えてファイルいら ずの方法を加えて,
  1. 一様乱数クラス Ranu はデフォルトではシステムクロックで初 期化される.
  2. (このステップは省略化) さらに Ranu::Initialization( "ファ イル名" ) を呼び出す,あるいは Ranu( "ファイル名" ) で オブジェクトを作ると,指定したファイルから乱数の種を読み 込む.
  3. オブジェクトが破壊時に,2. の操作をやっていたならば,乱 数の種を元のファイルに上書きする.ファイルから読みこんでなけ ればそのまま終了.
さて「すぐに終了するプログラム」を書く言語の代表格はと言えば, (このメイリングリストの皆様もよく使っておられる) Perl という ことになるかと思います.
竹中さんのご指摘で不安になったんで,さきほど
	perl -le 'print rand;'
というのを 10000 回ほど呼び出す実験をやってみました.全体で 100 秒ぐらいかかったんで (う,遅い) ,1 秒あたり 100 回ぐら い乱数が生成されたようです.
その結果なんですけど,一様検定とかちゃんとやってないんですけ ど,図示してみたところ「ま,ちゃんと一様じゃない」 (……いい かげんな) という程度には動作してくれてるようです.
…… といいかげんなことばかり書いてると不安になったんで,ネッ ト上で情報を漁ってみました.それで見つけた Perl の関数リファ レンス
	http://www.ns.kogakuin.ac.jp/~b196189/reference/perl/perl.html
によると (これはラクダ本か何かの複写だろうか?)
	srand( time | $$ )
による初期化を推奨してるようですね.この ( ... ) 内の奇怪な 暗号は
「システムクロック, それから今のプロセス id のビット単位の論理和」
という意味です.なーんで論理和取るとよいの ? か私には見当も つきませんけど,プロセス id も利用するのはこれもうまい手です よね.
	sub new {
		my $class = shift;
		my $self = {};
		(…… あーだこーだ ……)
		bless $self, $class;
	}
Barber [近所の床屋]
値段 2100 円と安く回転も
それなりに速いので便利な
店ではある.「1500 円 15
分」というあの琴似の店に
はまだ及ばないが ……


KuboLog | KuboWeb