• ベストアンサー

乱数について

線形合同法が乱数生成アルゴリズムとして欠点が多いことは有名です。 http://www001.upp.so-net.ne.jp/isaku/rand.html さて、自分のPC(OSはubuntu、言語はC++です。)で、rand()を用いて、 最下位ビットが0、1が繰り返して現れるかどうかを確認しましたところ、 そんなことはありませんでした。 このことから、自分のマシンは線形合同法を用いていないと判断してよいのでしょうか? また、よろしければ、マシンがどの乱数アルゴリズムを使っているかを 調べる方法を教えてください。 先のURLでは、「/usr/ucb/cc を解析した結果、」とありますが、 そんなディレクトリはありませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> では、ライブラリ・ソースがどこにあるのかを教えていただけますでしょうか。 コンパイラのマニュアル、コンパイラベンダのユーザサポート、システム管理者等にお問い合わせください。 あなたのマシンに何がインストールされてるか、 わかるはずもありません。

noname#108554
質問者

お礼

そうですか・・・それも面倒ですね。 当面の問題が乱数にあるわけではないような気がしてきたので、 この質問の重要度はそれほど高くないものになりました。 しかし、乱数生成アルゴリズムには興味があるので、 2,3日このままにしておきます。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

UbuntuということはLinux + glibc でしょうから、/usr/ucb というディレクトリは ないと思います(これはBSD系列とか、Solarisあたりだったような)。 Ubuntuのmanに日本語訳のものがついているかわかりませんが、 (日本語が表示できる状態で)man rand とか man random あたりでなにか 情報が得られませんか? あるいは info rand、info randomとか。 http://slashdot.jp/security/comments.pl?sid=286931&cid=835187 には > gnumaniak あたりの man ページを読んでもらえれば分かると思います >が、glibc の rand は random と同じです。 > >当然、線形合同法なんて使ってません。 という発言があります。 gnumaniakには日本語訳されたものもあるみたいですが、残念ながら rand/randomは訳されていないようです。 > では、ライブラリ・ソースがどこにあるのかを教えていただけますでしょうか。 libc/stdlib/rand.c - view - 1.4 http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdlib/rand.c?rev=1.4&content-type=text/x-cvsweb-markup&cvsroot=glibc libc/stdlib/random.c - view - 1.18 http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdlib/random.c?rev=1.18&content-type=text/x-cvsweb-markup&cvsroot=glibc コメントの英文がわからないから訳せというのは禁じ手でお願いします :)

noname#108554
質問者

お礼

man randで出てきたプログラムは、 static unsigned long next = 1; /* RAND_MAX assumed to be 32767 */ int myrand(void) { next = next * 1103515245 + 1804289383; return((unsigned)(next/65536) % 32768); } void mysrand(unsigned seed) { next = seed; } というものでした。実行したところ、rand()とは結果が異なりました。 と困っていたのですが、意外とメルセンヌツイスタ簡単でした。 ということでこの質問は締め切らせていただきます。 ありがとうございました。

回答No.2

>「英文を読むのが面倒くさい」 >「いまさらプログラムを全部書き直すのが面倒くさい」 ならば「ライブラリ・ソースを見つけ出して読む」ことになります。 より面倒くさくない方を選んでください。

noname#108554
質問者

お礼

では、ライブラリ・ソースがどこにあるのかを教えていただけますでしょうか。

回答No.1

この質問は「線形合同法では困るから」ですか? ならばもっといい乱数生成ルーチンがあるのでそれ使えばいいかと。 メルセンヌ・ツイスターなどいかがでしょうか。 # どんな乱数アルゴリズムを使っているかは、 # ライブラリのソースコードを読むしかないでしょうね。

参考URL:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html
noname#108554
質問者

お礼

ありがとうございます。 >この質問は「線形合同法では困るから」ですか? そのとおりなんですが、「英文を読むのが面倒くさい」というのと、 「いまさらプログラムを全部書き直すのが面倒くさい」というのが ありまして、randで問題ないようならこのまま行きたいというのが 正直なところです。

関連するQ&A