あなたのプロットの外観では、サイクルごとにちょうど1ビットを出すのではなく、あなたのランダムビットストリームが各サイクルの後にレジスタ全体を放出すると思います。これは、16ビットワードとして見た場合、x_(n+1)
がX_n/2
またはX_n/2 + 32768
のいずれかであることを意味します。これは、勾配が0.5(または、次数および/またはシフト方向に応じて2.0)の2つの対角線として現れます。
通常、LFSRを使用すると、1サイクルあたり1ビット、またはn
ビットのすべてがn
サイクルごとに発生します。これはいくつかの否定的な特性を生み出しますが、あなたが示したものほどはっきりしません。
なぜあなたのテストがダイハードに失敗するのか?あなたのテストセットアップに欠陥があるはずです。 Wikipediaのコードを変更してstdoutの各サイクルで16ビットの状態を出し、それをdieharder -a -g200
にパイプし、最初の5回のテストで直ちに失敗しました。それは、人が期待するものです。さらにhexdump -C
は明らかな目に見えるパターンを示す。
hexdump -C
は、16サイクルごとに16ビットの状態を出すようにコードを変更すると、はるかにランダムに見えますが、ダイハーダーはまったく同じように失敗します。
おそらく、発電機のソースをdieharderに指定していない可能性があります。そのため、デフォルトの内部発電機を使用しました。あなたは、出力の行5でこれを確認することができます:あなたは発電機のためのより徹底的なテストをしたい場合は
rng_name |rands/second| Seed |
mt19937| 1.42e+08 |1473327481|
そうであっても、TestU01を見ています。
出典
2016-06-18 18:44:26
sh1
スペクトルテストはその動作を捕捉するはずです。 Dieharderはそれを将来の追加可能性として挙げている。 – pjs
私が描いたイメージはスペクトルテストです(私は思います)。 –
純粋なペアワイズプロットのようです。 – pjs