FreeBSD QandA 2228
Q. 乱数を得ようと rand(3) を使ったのですが、生成される乱数の質が悪いよ
うです
A. FreeBSD の rand(3) 関数は、オンラインマニュアルにもあるとおり、非常
に質の悪い乱数生成関数ですので、使わない方がよいでしょう。
なお、乱数の質とはどのようなものかここでは触れませんので、後述の参
考文献 (*1) 等を参照してください。
乱数の利用目的とそれに応じた要求は大きく分けると次の2通りです。
(1) モンテカルロ (Monte Carlo) 法等のシミュレーション
再現性のある擬似乱数が必要です。 (決定論的乱数)
(2) 暗号
乱数列が推測できてはいけません。(非決定論的乱数)
(1) シミュレーション等に用いる擬似乱数
推奨はできませんが、どうしてもシステムで用意されている疑似乱数生
成関数を使いたい場合は、random(3) がいくぶんましです。
シミュレーション向けの擬似乱数については、2004年現在 Mersenne
Twister が最も良いでしょう。
<URL:http://www.math.keio.ac.jp/~matumoto/mt.html>
詳しくは「間違いだらけの擬似乱数選び」
<URL:http://www.soi.wide.ad.jp/class/20010000/slides/03/>
をご覧ください。
実装については、上記サイトで紹介されているものの他、C# 版が
<URL:http://takel.jp/mt/>
で公開されています。
また、言語によっては処理系や広く使われているライブラリで提供され
ています。例えば:
boost <URL:http://www.boost.org/> (C++, ports/devel/boost)
Blitz++ <URL:http://www.oonumerics.org/blitz/> (C++, ports/math/blitz++)
ports/math/p5-Math-Random-MT (perl)
(2) 暗号
暗号に用いる場合、簡単にいうと、生成される乱数列が推測できてはい
けません。FreeBSD では、/dev/random が利用できます。また、RC4 暗
号に用いられる疑似乱数生成関数 arc4random() も用意されています。
それぞれ、random(4)、arc4random(3) のマニュアルを参照してください。
5.0-RELEASE 以降では、random(4) が
Yarrow アルゴリズム <URL:http://www.counterpane.com/yarrow.html>
を使うように書き直され、かなり良いものになったようです。
FreeBSD に依存しないものだと、OpenSSL で乱数生成用の API が提供さ
れています (RAND_*)。engine(3)、rand(3) 等、関連するマニュアルを
参照してください。
詳しいことは暗号関連の参考書を調べてください。
なお、OpenSSL のマニュアル rand(3) はシステムの rand(3) 関数と重なって
いるので、man -a 3 rand と -a オプションを指定しないと読めないでしょう。
(*1) 乱数に関する参考資料
日本語の書籍としては、
・『準数値算法/乱数』 D.E. Knuth 著、渋谷 政昭 訳 (サイエンス社)
"The Art of Computer Programming, vol.2: Seminumerical Algorithms"
2nd ed. Addison-Wesley, Reading, Mass. の訳です。
・『乱数』 伏見 正則 著 (東京大学出版会、ISBN 4-13-064072-0)
を挙げておきます。ただし、後者には「乱数とは何か?」という話はあり
ません。WWW では、次の
Random Number Generators <URL:http://random.mat.sbg.ac.at/>
また、Diehard という乱数生成器を試験するソフトウェアもあります。
<URL:http://stat.fsu.edu/~geo/diehard.html> (ports/math/diehard)
参考: [FreeBSD-users-jp 69480] とそれを含むスレッド
間違い・追加情報を見付けた場合は、
修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで
お知らせください。