バイトのリストがランダムかどうかを判断する最良の方法は?


8

ランダム性のレベルを示す値を返すことができるアルゴリズムはありますか?データエントロピーと呼ばれていると思います。

私は最近この記事を読みました:http : //faculty.rhodes.edu/wetzel/random/mainbody.html

コイン投げを分析する彼のアプローチはバイトに適用されますか?ビットレベルにドロップする必要がありますが、それは再びtrue / falseになりますか、それとも完全なバイト値に基づいて判断する方法はありますか?

彼らはこの記事よりも優れた分析ですか?

回答:


16

TCSでは、この問題への別のアプローチは、分布のプロパティテストによるもので、分布が(真に)均一な分布であるか、または(正式な方法で)均一に「近い」ものでもないかどうかを区別します。ここで、質問を決定するために必要なサンプル数の正確な限界を取得します。

たとえば、次のチュートリアルのセクション6を参照してください。http: //people.csail.mit.edu/ronitt/papers/icm.ps

特に、[]真に均一であるか、または -far(における全変動距離で均一から)O ε上記の分布からのクエリ/サンプル。(これも Ω O/ε4サンプルが必要です。)Ω


興味深いことに、これらのメソッドはすべて、分布がiidであることを前提としています。つまり、エントロピーが非常に低い123123123などの単純な循環シーケンスは、高い確率で均一と見なされます。誰かが非iidシーケンスの配布テストを検討したかどうかを知っていますか?
Thomas Ahle 2017

私はこれを書いて、単純なシーケンスのようなものをチェックし、均一なランダムバイト分布からの全体的な変動を検出します... github.com/earonesty/dotfiles/blob/master/randbytestest.pyでかなりうまくいきます。
Erik Aronesty

6

ランダム性を測定するための単一の正しいアルゴリズムはありません。他の人がすでに述べたように、さまざまな統計的検定が1つの可能なアプローチです。もう1つの可能性は、バイトシーケンスを圧縮して何が起こるかを確認することです。約8ビット/バイト(またはそれ以上)を取得する場合、圧縮プログラムの基礎となるデータモデルに関してシーケンスはランダムです。

標準的な圧縮方法のうち、PPMは明示的な統計モデルを使用して、前のコンテキストに基づいて次の文字を予測します。その主な弱点は、長いランダムシーケンスの同一反復などの大規模な反復を利用できないことです。

LZ77解析またはBurrows-Wheeler変換(BWT)に基づく圧縮方法は、シーケンス内に多数のサブストリングが繰り返されている場合にうまく機能します。ただし、多くの実用的な実装では、メモリを節約するためにブロック/ウィンドウのサイズが制限されているため、大規模な反復を利用することもできません。

シーケンスを圧縮する代わりに、コンプレッサーのデータモデルに関連するいくつかの測定値を計算することもできます:PPMの高次の経験的エントロピー、BWTでの等しい文字の数、またはLZ77解析でのフレーズの数。最初の2つのケースでは、バイトあたり8ビットのエントロピーまたはn(1-1/256)が実行され、長さnのシーケンスは完全にランダムなデータを意味します。


5

random.orgから:

奇妙なことに、乱数ジェネレータが本当にランダムであることを証明することは理論的に不可能です。むしろ、特定のジェネレーターによって生成される数値の増加量を分析し、結果に応じて、ジェネレーターに対する信頼度が増加(または場合によっては減少)します。

詳細については、こちらをご覧ください


4

数値には適していますが、バイトシーケンスには適していません。それを適応させることもできます
Erik Aronesty

@Erikそれは多くの方法で容易に適用されます。必要なのは、RNGを使用してビットシーケンスを作成する方法だけです。バイトシーケンスはすでにビットシーケンスです。
whuber

たとえば、32バイトシーケンスの30サンプルの配列にそれを適用する方法はわかりませんでした。とても包括的に見えます...そして使いやすいです(apt install dieharder)。
Erik Aronesty

1
@Erikドキュメントによると、「dieharderは、GSL互換のインターフェースにラップされたジェネレーターをテストして、無制限の乱数ストリームを返すことができるようにすることを好む」とのことです。そのため、32バイトのシーケンスは、8つの符号なしshort、4つの符号なしlong などのシーケンスとして解釈できます 非常に柔軟ですが、インターフェースを作成する必要があります。
whuber

@ErikAronesty:30 * 32バイトだけでは十分なデータではなく、ランダム性テストでこの事実を回避することはできません。ダイハーダーは、(十分な理由で)1GB程度のデータが得られるまでサンプルサイズを笑います。
ジェイサリバン

3

コルモゴロフの複雑さは、文字列のランダム性を測定する1つの方法であり、アルゴリズム的には計算できません。この概念を使用すると、すべての文字列のランダム性を測定することは不可能です。このようなアルゴリズムの存在は、停止の問題を解決するために使用できます。


3

他の回答が述べたように、この問題の決定バージョン(停止問題やタイリング問題などの他の多くの問題など)は決定できません。ただし、ビットのコレクションのランダム性を測定する実用的な方法について質問していると思います。

ここでの標準的な方法は、カイ2乗検定などの一連のランダム性検定を通じてデータを実行することです。


3

p1/k/

実際には、ストリームのランダム性に対する普遍的なテストはありません。代わりに一連のテストがあり、ストリームが最高のテストのkを試行してすべてに合格した場合、誰かがk + 1を発明するまで、ランダムであると合理的に確信できます。それを壊すstテスト。

「Art of Computer Algorithms、Vol 2」の中で、Knuthがそれについて語っています。

「シーケンスがテストT1、T2、...、Tnに関してランダムに動作する場合、それがさらにテストT(n + 1)を受けたときに、それが悲惨な失敗ではないことは、一般に確信できません。各テストにより、シーケンスのランダム性に対する信頼がますます高まっています。実際には、シーケンスに約6種類の異なる統計テストを適用し、それが十分に合格した場合、ランダムであると見なします。有罪が証明されるまでは無実だ」と語った。

疑似ランダム性の概要についてはKnuthの「Art of Computer Algorithms」のセクション3.1を、ストリームの統計検定については3.3をお勧めします。


0

私はかなり弱いテストのセットを作成しましたが、それでも私にとっては非常に有用であり、一般にランダム性テストの性質を示しています。

  1. 「既知の良好なランダムデータ」の統計を生成する(数学的または経験的に)
  2. サンプルデータに対して同じ統計を生成します(できれば、少なくとも30個程度のサンプルがあるはずです)。
  3. 差のp値を取得します(仮説:これらは異なる分布からのものです)
  4. N統計について繰り返す
  5. bonferonniは結果を修正します(Nで除算)

ソースはこちら:https : //github.com/earonesty/dotfiles/blob/master/randbytestest.py

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.