FreeBSD QandA 2228

FreeBSD QandA

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 まで お知らせください。