|
ひとつ前へ WWWルートへ 記述責任者:mad@mail.wind.ne.jp |
|
乱数(C) 数理設計研究所 玉置晴朗 |
ここに公開するものは、”非公開のある方法”によって数理設計研究所内によって生成された乱数ファイルです。乱数の性質は各種の方法によって検査し、かなり良いものだと自負していますが、保証の限りではありませぬ。
LZHなどで圧縮しても乱数は圧縮不可能なので、かえって大きくなります。
モンテカルロ法に代表される数値計算のための乱数はエルゴード性を仮定することが多い。エルゴード性とは、ある乱数列Vのグループが複数M個あったとして、これを2次元的(V×M個の行列)に観察したときに縦にサンプルしても横にサンプルしても、大量にあるならば同じような特徴を示すということです。まあ色がついてない乱数の不思議な定義。
暗号化、暗号解読の主部はアルゴリズムです。アルゴリズムは公開されていることもあれば秘密にしていることもあります。いずれにしろ、覗き見ようとする者にとってアルゴリズムは(盗んだり、漏れたりで)公開されているとみなします。
どんなに複雑精妙なアルゴリズムでも、元になる情報は原文と鍵。実用上の暗号強度は、暗号を作成する鍵の予測不可能性に帰着します。人が作る鍵はかなり同じパターンを示しますし擬似乱数でも予測可能です。
そこで、神のみが知る情報によって(つまり誰も知らない)作られる乱数が必要。ここに提供する乱数データは「マクスウェルの悪魔」さんが作ったものです。
乱数頻度数から頻度期待値を差し引いたAC振幅をエネルギーとして見ている統計的な評価法である。白色雑音に近いかどうかを検定しているとみなしてもいいだろう。
![]() |
当研究所で生成した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の長い連続がいつか出る。これの頻度数を見ると乱数性が良く見える。
![]() |
当研究所 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