LFSRは実際のアプリケーションでどのようにPRNGとして使用されますか?


8

学習のためにソフトウェアでLFSR(線形フィードバックシフトレジスタ)をプログラミングしていますが、疑似乱数ジェネレータ(PRNG)としての使用にいくつかの制限がありました。

  • シードの「1」ビットが少なく、使用するタップが少ない場合、「1」と「0」または「0」の実行がほぼ等しい分布で、見かけ上ランダムな出力を生成するには大きな「起動時間」が必要です。タップ数が多いほど、このような起動ははるかに速くなると思いますが、私が見つけたすべての事前計算されたテーブルは2つまたは4つのタップを提供します。
  • 連番は非常に相関性が高く、出力ビットが0の場合、次の数は前の数の半分になります。タップ付きの15ビットLFSR [15、14]の場合、平面内の点として一連の連続番号をプロットすると、次のようになります。理想的なPRNGは、これらのポイントを場所全体に広げる必要があります。

画像

LFSRは高速ハードウェアカウンターとして使用されることは知っていますが、ホワイトノイズを作成するためのPRNGとして使用されることも確認しました。このような低品質の現実世界のアプリケーションでどのように使用されますか?


@rawbrawbが指摘するように、LFSRは疑似乱数の生成にはあまり適していません。シフトレジスタの内容の一部(たとえば、32ビット長のLFSRの最下位16ビット)のみを乱数として使用する場合、問題はさらに悪化します。詳細については、crypto.SEに関する最近のQ&Aを参照してください。
Dilip Sarwate、2013年

回答:


4

PRNGに関するすべての優れた情報源は、Solomon Golombによる「シフトレジスタシーケンス」です。さまざまなクラスとテクニックについて説明します。

すべてのレジスタをリセットして起動するのは1つの方法です。または、シードの並列ロードは別です。ただし、すべてゼロの文字列が有効な状態であることを忘れないでください。

シフトレジスタのすべてのフィードバック設定で最大のPRNGシーケンスが得られるとは限らないため、正しいコードを選択することが重要です。

PRNGの操作方法は、PRNGのパフォーマンスに影響します。

15ビットのレジスターでコードを検索する場合、[15,4]は[15,1]と同様に最大ですが、[15,14]はリストされていません。->出典-「スペクトラム拡散システムとアプリケーション」-Robert Dixon 3rd Ed。94ページ。この本は、実装に関する非常に優れたリファレンスです。

一般に、LFSRは貧弱なPRNGを作成し、一般的な慣行は下位ビットのみを使用することです。または、長さとコードが異なる2つのPRNGを生成し、下位ビットをxorで生成して、新しいコードを生成することもできます。おそらくビット長の1/2未満を使用する必要があります。したがって、30および31ビット長のレジスタと15 LSBのXORを行います。

NISTには、優れたテストコードがあります。だから、はい、PRNGのために、それはひどいです。


タップのセットがある場合[nbits, a, b, c]、最大の別のセットは[nbits, nbits-a, nbits-b, nbits-c]です。この方法では、[15,14]と[15,1]の両方が最大になります。
Bruno Kim

レジスターのセットアップに応じて、すべてゼロまたはすべて1は無効です。私がするほとんどのことでは、すべてゼロは無効ですが、あなたはそれを上記で有効であると指摘したので、これがそこに捨てられたことを確認したかったのです。;)
アーロンD.マラスコ2013年

パフォーマンスを向上させる方法の詳細を追加しました。しかし、それはうまくいきません。私はこれらをSSDSで使用しました-自己相関の性質。デュアルについては忘れてしまいました。
プレースホルダー

興味深いアイデア、XORの異なるLFSRですが、数値はまだ相関していると思います。おそらく、ティムの答えを使用して、別の番号を選ぶ前に完全なサイクルを実行する方が良いでしょう。
Bruno Kim

@BrunoKimそれはオリジナルではなく、より効率的な計算または面積効率です。リピートの長さも2 ^ 30番目になります。
プレースホルダ

7

連番は非常に相関性が高く、出力ビットが0の場合、次の数は前の数の半分になります。タップ付きの15ビットLFSR [15、14]の場合、平面内の点として一連の連続番号をプロットすると、次のようになります。理想的なPRNGは、これらのポイントを場所全体に広げる必要があります。

15ビットLFSRで乱数を生成する場合は、クロックサイクルごとに新しい乱数を取得する必要はありません。あなたが唯一のレジスタへのクロック・サイクルごとに1つの新しいビットを追加しているので、あなたが言ったように、サイクルの価値NとはN+1非常に強く相関することになります。ランダムな値を生成したい場合(適切なタップがある場合)、15クロックごとに新しい値をプルするだけで済みます。

LFSRは、15のランダムビットではなく、サイクルごとに1つのランダムビットのみを保証します。


1
任意のビット数をコーディングしています。一般的に、ランダムな整数(64ビット)が必要な場合は、128ビットのLFSR(rawbrawbの提案に従う)を使用し、数値を選択する前に64回反復する必要がありますか?一部の数字は見落とされ、他の数字は「均一な」分布で予想よりも多く選ばれたのではないでしょうか。
ブルーノキム

2

実際の例は、MPC7450 RISC Microprocessor Family Reference Manualにあります。7450は、ビット0から4、ビット5から9、およびビット10から15の3つの単純なシフトレジスタを持つ16個のラッチで構成されるL2およびL3置換のpRNGを使用しました。ビット0は、ビット4と15のXORから取得されます。ビット5はビット4と9のXORから得られ、ビット10はビット6と15のXORから得られます。8ウェイキャッシュの置換方法は、L2のビット4、9、15とビット0で示されます。 、5、およびL3の場合は10。ビットはサイクルごとにシフトされましたが、キャッシュの交換はそれほど頻繁には発生しませんでした。(別のカウンターベースの交換メカニズムも提供されました。)

これは潜在的に問題があると認識されていました:

L2キャッシュルックアップのレイテンシにより、読み取りミスと置換ラインの割り当ての間に3クロックサイクルがあります。このため、上記のアルゴリズムを使用して、2つまたは3つの連続した読み取りミスの代わりに同じ方法を選択できる可能性があります。これを回避するために、実際のアルゴリズムは選択された置換ラインを以前の3つの置換ラインと比較します。選択した行が前の3つの行のいずれかと一致する場合、置換方法を選択する値に1、2、または3の値が自動的に追加されます。

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