ひとつ前へ WWWルートへ 記述責任者:mad@mail.wind.ne.jp

乱数

(C) 数理設計研究所 玉置晴朗
2002/11/13 - 2004/04/03


他の参考文書

  1. 数理設計内 M系列符号
  2. 他の研究者 産業技術総合研究所 宮城さんによる乱数性評価

乱数データ公開のコメント

 ここに公開するものは、”非公開のある方法”によって数理設計研究所内によって生成された乱数ファイルです。乱数の性質は各種の方法によって検査し、かなり良いものだと自負していますが、保証の限りではありませぬ。
 LZHなどで圧縮しても乱数は圧縮不可能なので、かえって大きくなります。

用途による乱数の性質

数値計算のための乱数

 モンテカルロ法に代表される数値計算のための乱数はエルゴード性を仮定することが多い。エルゴード性とは、ある乱数列Vのグループが複数M個あったとして、これを2次元的(V×M個の行列)に観察したときに縦にサンプルしても横にサンプルしても、大量にあるならば同じような特徴を示すということです。まあ色がついてない乱数の不思議な定義。

暗号のための乱数

 暗号化、暗号解読の主部はアルゴリズムです。アルゴリズムは公開されていることもあれば秘密にしていることもあります。いずれにしろ、覗き見ようとする者にとってアルゴリズムは(盗んだり、漏れたりで)公開されているとみなします。
 どんなに複雑精妙なアルゴリズムでも、元になる情報は原文と鍵。実用上の暗号強度は、暗号を作成する鍵の予測不可能性に帰着します。人が作る鍵はかなり同じパターンを示しますし擬似乱数でも予測可能です。
 そこで、神のみが知る情報によって(つまり誰も知らない)作られる乱数が必要。ここに提供する乱数データは「マクスウェルの悪魔」さんが作ったものです。

乱数性

χ2分布

 乱数頻度数から頻度期待値を差し引いたAC振幅をエネルギーとして見ている統計的な評価法である。白色雑音に近いかどうかを検定しているとみなしてもいいだろう。

計算法:

  1. 一様乱数をバイト単位で処理する
  2. バイト単位では0〜255の値があるので、256個の頻度計数BOX(H)を用意する
  3. 全バイトについて頻度計数を勘定し、全バイト数をSとする
  4. 0〜255のnについて (H[n]-S/256)2/(S/256) を総和すると一様乱数なら256を中心とした正規分布になり。およそ200〜300の範囲におさまると良好とされる。
当研究所で生成した200MByte
128kバイト単位で計算してχ自乗分布としたもの

横軸 χ2検定値
縦軸 頻度数

正規分布に近いでしょう?
当研究所で生成した140MByte
128kバイト単位で計算してχ2分布としたもの

横軸 χ自乗検定値
縦軸 頻度数

これも正規分布に近いのですが、期待する256より少し低めになっている。
C++のrand()関数
線形合同法による200MByte
128kバイト単位で計算してχ自乗分布としたもの

横軸 χ2検定値
縦軸 頻度数

皆さんが使っている乱数!

この乱数は
unsigned char d = rand() % 0xff
として生成した。
C++のrandom()関数
線形合同法による200MByte
128kバイト単位で計算してχ自乗分布としたもの

横軸 χ2検定値
縦軸 頻度数

皆さんが使っている乱数!

この乱数は
unsigned char d = random() % 0xff
として生成した。
M系列24ビット、4タップの全タイプ190種の系列をひとつづつ全部使い140Mバイト(1.1Gビット)にしたもののχ自乗検定

これぐらい混ぜるとかなりまとも。

自己相関関数

 白色性を持つ長いデータ列の自己相関関数はオフセット0以外では小さな値を持つ。ここでは1M点FFTを使って自己相関関数を計算し、ゼロ位置の振幅を1に規格化している。似たようなものだ。
項目 バイト単位 ビット単位
当研究所
1Mbyte
rand()
1Mbyte
当研究所
1Mbit
rand()
1Mbit
最大相関位置 1032192 507725 895928 47600
最大相関の値 0.0051 0.023738 0.0044 0.0153
ゼロ位置を除く平均 0.7 10-7 0.23 10-7 -8.87 10-7 -1.8 10-7
ゼロ位置を除く振幅平均 0.00077 0.00076 0.00078 0.00076

1/0の連続

 長い乱数を眺めれば1/0の長い連続がいつか出る。これの頻度数を見ると乱数性が良く見える。
当研究所 200Mbyte(1.6Gbit)
1/0の連続検査

最長連続
1→31ビット(1回)
0→30ビット(1回)

ほぼ完璧

横軸 1/0連続長
縦軸 頻度数 (2を底とする対数)
rand() 200Mbyte(1.6Gbit)
1/0の連続検査

最長連続
1→26ビット(24回)
0→23ビット(47回)

整数計算の限界か、32ビット付近は良くない

横軸 1/0連続長
縦軸 頻度数 (2を底とする対数)

..end