A/Dポートを使った乱数の性能

一般的に応用されているオープン(未接続)ADポートを使った乱数の品質を測定してみました。

乱数評価の指標としてFIPSなど規格はありますけれども、もっと具体的に「クラスに同じ誕生日の人がいる確率」のような例として
例えば、DALIなどの24bit固有IDにADの乱数を使用した場合の性能として
ネットワークに接続された台数に応じてどれくらいの確率でアドレスが一致か(ぶつかるか)をAD変換時間による変化を見てみました。

↓の結果から一番性能がいい設定(変換時間=38usec)でも30台を超えると50%の確率でアドレスの衝突が発生するようです。真性乱数に比べると有効ビットが半分程度になるみたいですね。

温度や外来ノイズ?など同じ設定でも測定するたびに一致確率が10%20%くらい大きくバラつきますけど、
概ね変換時間が長い方が性能が良くなる傾向があるようです。

  • Kirinさん
    うーんすごい、「真性乱数」の意味も知りませんでした、
    「A/Dの端子処理は端子処理は不要」でできるのですね、覚えておきます。
  • シェルティさん

    お褒めの言葉ありがとうございます。

    そうですね、高速な乱数発生チップは、1個数百円するので、ローエンドマイコンがメインになるシステムに敷居が高いですね。
    かといってTRNG搭載のマイコンを選定すると他の選択肢やコストが犠牲になりますし。

    以前シェルティさんさんが教えてくれたNIST SP800-22の検定をするには1Gビットのデータ必要で、これを100回流すには、乱数生成に1年掛かります(汗)
    クラウドで走るGHzオーダーのアプリケーションなら、ものの数秒で1Gビットの乱数を生成できそうですけども、数十MHz駆動のマイコンには向かい評価基準でした。

    システムがアイドルの時に乱数を作りだめしておくのは賢いアイデアですね。私も使わせていただきます^^

  • Kirinさん

    シェルティです、こんにちは。

    RX231に内蔵されている暗号器(NIST SP800-22のテスト実施でOKと聞いています)で、
    真性乱数の衝突検証をしてみたところ、Kirinさんのおっしゃる通り0.02%あたりに収束しました。
    Kirinさんの手法はローエンドでの乱数生成方法としてやはりとても良いアイデアですね。
    役に立つ情報をいただき、感謝しております。

    以上です
  • シェルティさん
    TRNGの実機検証ありがとうございます。
    真性乱数なのに衝突が発生してしまうのは、意外な感じがしますけれども、確率統計的にも実機でもある頻度で発生することが確認できてよかったです。

    今後は、ライブラリ化して使いやすい形にできるといいかなと思っています。
  • A/D版の乱数生成のサンプルとアプリケーションノートを作成しました。

    https://japan.renesasrulz.com/cafe_rene/m/sample_program/410

    A/D版は条件(温度・電圧)によっては、同一値が数百ビット連続で出力されてしまうことがあるため、実運用で使用するのは難しいかもしれません。
    (良い時はいいんですけどねー)
    性能確認のため、サンプルに乱数品質を自己確認できるように真性乱数換算の有効ビット数を算出する関数を加えています。

     

    温度や電圧によって、トランジスタのリーク電流のバランスが崩れて(整って?)乱数が正常に生成されなくなることがあります。
    手元のサンプルでは24℃の時に5.5V付近になると最悪の条件が揃うようです。温度が下がるにつれて条件となる電圧値が下がっていきましたけれども条件を管理するのは難しそうです。
    また、変換時間を相当長くしないとこの状態から脱することができないようです。(時間を掛けるならタイマーを使った乱数生成の方が有利かなと)

  • Kirin様

    こんにちは、Sugachanceです。
    素晴らしいサンプルとアプリケーションノートありがとうございます。
    (きっと)実験で利用させていただきます。

    秀逸なデザインと型番ですね(笑)
  • Sugachanceさん
    お褒めの言葉ありがとうございます。
    デザインは違和感の無いように皆さん見慣れているアプリケーションノートをオマージュしています^^