Operator Library: Base
オペレーター PseudoRandomNumberGen は、線形フィードバックシフトレジスタ(LFSR)を使用してNビットの乱数ストリームを生成します。 これらのLFSRは、一様に分布したバイナリランダムシーケンスを生成します。 シーケンスが繰り返されるまでの長さは、フィードバックシフトレジスタのレジスタ数によって定義されます。 32ビット長のLFSRは、2^32 - 2値のシーケンスを生成します。 実装されている乱数ジェネレーターは、異なるLFSRを使用してオペレーター出力でNビットの乱数を生成します。 これにより、シーケンス長が長くなり、ビット間の相関が回避されます。 次の図は、疑似乱数ジェネレーターの実装を示しています。

乱数の Quality をさらに向上させるため、LFSRはフリーランニングであり、画素周波数によるクロックソースではありません。 したがって、結果のタイミングは非決定論的であり、真の乱数が値の生成に取り入れられるため、 Quality が劇的に向上します。
LFSRは、アプレットの初期化時にシードで事前初期化されます。 このシードは、VisualAppletsでパラメータ Seed0、Seed1、Seed2 を使用して定義されます。 オペレーターのインスタンス化時には、デフォルトのシード値にソフトウェア乱数ジェネレーターが使用されます。
オペレーターは、さまざまなビット幅と Parallelism をサポートしています。 ただし、 Parallelism とビット幅が高いほど、より多くのリソースが必要になります。 出力ビット幅は、出力リンクを使用して調整できます。
オペレーターの入力リンクは、同期のためにのみ使用されます。 入力リンク上のデータ値は、データ出力の生成には使用されません。
パラメータ Min_LFSR_Length は、最も短いLFSRの長さを指定するために使用されます。 さらにLFSRを追加するごとに、別のレジスタステージが追加されます。 最大レジスタ長は168です。
オペレーターに必要なリソースを削減するには、パラメータ Min_LFSR_Length を減らします。 同じ Min_LFSR_Length で複数のオペレーターを使用した場合、どちらも同じシーケンスを生成します。 シードが異なっていても、シーケンス自体は同じであり、変更されるのはシーケンスの開始点のみです。
疑似乱数ジェネレーターで真の乱数値を生成することはできません。 効率的なジェネレーターの実装と非決定論的タイミングの追加により、生成された値の Quality は非常に高くなります。 以下では、実装の Quality を証明するためにジェネレーターに適用された2つのテストの結果を示します。
-
等分布のテスト:
8ビットの乱数シーケンスが生成され、平均値が決定されます。平均値は約127.5になるはずです。 LFSRの理論から、シーケンスは常に等分布であることがわかります(すべてのレジスタの値が0の場合を除きます)。
生成された値のヒストグラムを見ると(microDisplayなど)、一様分布を確認できます。

-
スペクトルテスト:
スペクトルテストでは、ジェネレーターのシリアル相関をテストします。生成されたシーケンスにパターンが表示されてはなりません。 不良なジェネレーターは、2次元または3次元空間に超平面を表示します。 VisualAppletsのジェネレーターには超平面は表示されません。


不良なジェネレーターの例を次の図に示します。 これは、Cプログラミング言語の rand() 関数で主に使用されている有名なRANDUジェネレーターです。

オペレーターはVisualAppletsで完全にシミュレーションできます。 ただし、非決定論的なハードウェア実装は、シミュレーション用のソフトウェアでは実装できません。 そのため、シミュレーションでは Quality の低い非常にシンプルな乱数ジェネレーターが使用されます(MS VisualStudioの rand() 関数)。 シードを変更しない場合、オペレーターは常に同じシーケンスを生成します。
| Min_LFSR_Length | |
|---|---|
| タイプ | static パラメータ |
| Default | random |
| 範囲 | [3, 168] |
|
このパラメータは、最も短いLFSRの長さを指定します。 値が大きいほど、リソース消費量が高くなります。 次の制約に注意してください:
|
|
| Seed0 | |
|---|---|
| タイプ | static/dynamic read/write parameter |
| Default | random |
| 範囲 | [0, 2^64 - 1] |
|
オペレーターの導入で説明したように、シードはLFSRを事前初期化するために使用されます。 オペレーターのインスタンス化時に、これらの値はソフトウェア生成された乱数を使用して初期化されます。 これらの値は、取り込み中に変更できます。 パラメータ Seed2 が変更されると、3つのパラメータすべての値がラッチされます。 |
|
| Seed1 | |
|---|---|
| タイプ | static/dynamic read/write parameter |
| Default | random |
| 範囲 | [0, 2^64 - 1] |
|
オペレーターの導入で説明したように、シードはLFSRを事前初期化するために使用されます。 オペレーターのインスタンス化時に、これらの値はソフトウェア生成された乱数を使用して初期化されます。 これらの値は、取り込み中に変更できます。 パラメータ Seed2 が変更されると、3つのパラメータすべての値がラッチされます。 |
|
| Seed2 | |
|---|---|
| タイプ | static/dynamic read/write parameter |
| Default | random |
| 範囲 | [0, 2^64 - 1] |
|
オペレーターの導入で説明したように、シードはLFSRを事前初期化するために使用されます。 オペレーターのインスタンス化時に、これらの値はソフトウェア生成された乱数を使用して初期化されます。 これらの値は、取り込み中に変更できます。 パラメータ Seed2 が変更されると、3つのパラメータすべての値がラッチされます。 |
|
PseudoRandomNumberGen オペレーターの使用方法は、以下の例に示されています。




前へ

