一般的に応用されているオープン(未接続)ADポートを使った乱数の品質を測定してみました。
乱数評価の指標としてFIPSなど規格はありますけれども、もっと具体的に「クラスに同じ誕生日の人がいる確率」のような例として例えば、DALIなどの24bit固有IDにADの乱数を使用した場合の性能としてネットワークに接続された台数に応じてどれくらいの確率でアドレスが一致か(ぶつかるか)をAD変換時間による変化を見てみました。
↓の結果から一番性能がいい設定(変換時間=38usec)でも30台を超えると50%の確率でアドレスの衝突が発生するようです。真性乱数に比べると有効ビットが半分程度になるみたいですね。
温度や外来ノイズ?など同じ設定でも測定するたびに一致確率が10%20%くらい大きくバラつきますけど、 概ね変換時間が長い方が性能が良くなる傾向があるようです。
シェルティさん
お褒めの言葉ありがとうございます。
そうですね、高速な乱数発生チップは、1個数百円するので、ローエンドマイコンがメインになるシステムに敷居が高いですね。 かといってTRNG搭載のマイコンを選定すると他の選択肢やコストが犠牲になりますし。
以前シェルティさんさんが教えてくれたNIST SP800-22の検定をするには1Gビットのデータ必要で、これを100回流すには、乱数生成に1年掛かります(汗) クラウドで走るGHzオーダーのアプリケーションなら、ものの数秒で1Gビットの乱数を生成できそうですけども、数十MHz駆動のマイコンには向かい評価基準でした。
システムがアイドルの時に乱数を作りだめしておくのは賢いアイデアですね。私も使わせていただきます^^
A/D版の乱数生成のサンプルとアプリケーションノートを作成しました。
https://japan.renesasrulz.com/cafe_rene/m/sample_program/410
A/D版は条件(温度・電圧)によっては、同一値が数百ビット連続で出力されてしまうことがあるため、実運用で使用するのは難しいかもしれません。 (良い時はいいんですけどねー) 性能確認のため、サンプルに乱数品質を自己確認できるように真性乱数換算の有効ビット数を算出する関数を加えています。
温度や電圧によって、トランジスタのリーク電流のバランスが崩れて(整って?)乱数が正常に生成されなくなることがあります。 手元のサンプルでは24℃の時に5.5V付近になると最悪の条件が揃うようです。温度が下がるにつれて条件となる電圧値が下がっていきましたけれども条件を管理するのは難しそうです。 また、変換時間を相当長くしないとこの状態から脱することができないようです。(時間を掛けるならタイマーを使った乱数生成の方が有利かなと)