Operator Library: Base
PseudoRandomNumberGen 運算子使用線性回授移位暫存器 (LFSR) 來產生一串 N 位元的隨機數。 這些 LFSR 會產生均勻分佈的二進位隨機序列。 隨機序列在重複之前的長度取決於回授移位暫存器的暫存器數量。 32 位元長度的 LFSR 將產生 2^32 - 2 個值的序列。 實作的隨機數產生器使用不同的 LFSR 在運算子輸出端產生 N 位元的隨機數。 這增加了序列長度並避免了位元之間的相關性。 下圖說明了偽隨機數產生器的實作方式。

為了進一步提高隨機數 Quality,這些 LFSR 是自由運行的,且不由像素頻率提供時脈。 因此結果的時序具有非確定性,這意味著真實的隨機數被納入值產生的過程中, 從而顯著提高了 Quality。
在 Applet 初始化時,LFSR 會使用種子進行預先初始化。 此種子在 VisualApplets 中使用參數 Seed0、Seed1 和 Seed2 來定義。 在運算子實例化時,會使用軟體隨機數產生器來產生預設的種子值。
此運算子支援不同的 Bit Width 與 Parallelism。 然而,對於高 Parallelism 與 Bit Width,需要更多的資源。 輸出 Bit Width 可以透過輸出連結進行調整。
運算子輸入連結僅用於同步。 輸入連結上的資料值不會用於產生資料輸出。
參數 Min_LFSR_Length 用於指定最短 LFSR 的長度。 對於每一個額外的 LFSR,都會增加另一個暫存器級。 最大暫存器長度為 168。
若要減少運算子所需的資源,請減少參數 Min_LFSR_Length。 如果有多個運算子使用相同的 Min_LFSR_Length,它們將會產生相同的序列。 如果種子不同,序列仍然相同,只是序列的起始點改變了。
偽隨機數產生器永遠無法產生真正的隨機值。 由於有效率的產生器實作以及加入了非確定性時序,所產生之值的 Quality 非常高。 以下將介紹對產生器進行的兩項測試結果,以證明實作的 Quality。
-
均勻分佈測試:
產生一串 8 位元的隨機值並計算其平均值。平均值應該大約為 127.5。 從 LFSR 的理論中我們知道,序列始終是均勻分佈的(所有暫存器中的值為 0 的情況除外)。
如果查看所產生值的直方圖(例如在 microDisplay 中),就可以看出均勻分佈。

-
頻譜測試:
頻譜測試是用來測試產生器的序列相關性。產生的序列中不應顯示任何圖案。 不良的產生器會在二維或三維空間中顯示超平面。 VisualApplets 產生器不會顯示任何超平面:


下圖顯示了一個不良產生器的範例。 它是著名的 RANDU 產生器,主要用於 C 程式語言中的 rand() 函式。

該運算子可以在 VisualApplets 中完全進行模擬。 然而,非確定性的硬體實作無法在模擬的軟體中實現。 因此,模擬中使用了 Quality 較差且非常簡單的隨機數產生器(MS VisualStudio 的 rand() 函式)。 如果種子未更改,運算子將始終產生相同的序列。
| Min_LFSR_Length | |
|---|---|
| Type | static parameter |
| Default | random |
| Range | [3, 168] |
|
此參數指定最短 LFSR 的長度。 較高的值會導致較高的資源消耗。 請注意下列限制:
|
|
| Seed0 | |
|---|---|
| Type | static/dynamic read/write parameter |
| Default | random |
| Range | [0, 2^64 - 1] |
|
如運算子簡介中所述,種子是用來預先初始化 LFSR。 在運算子實例化時,這些值會使用軟體產生的隨機數來初始化。 這些值可以在擷取期間更改。 當修改參數 Seed2 時,所有三個參數的值都會被鎖存。 |
|
| Seed1 | |
|---|---|
| Type | static/dynamic read/write parameter |
| Default | random |
| Range | [0, 2^64 - 1] |
|
如運算子簡介中所述,種子是用來預先初始化 LFSR。 在運算子實例化時,這些值會使用軟體產生的隨機數來初始化。 這些值可以在擷取期間更改。 當修改參數 Seed2 時,所有三個參數的值都會被鎖存。 |
|
| Seed2 | |
|---|---|
| Type | static/dynamic read/write parameter |
| Default | random |
| Range | [0, 2^64 - 1] |
|
如運算子簡介中所述,種子是用來預先初始化 LFSR。 在運算子實例化時,這些值會使用軟體產生的隨機數來初始化。 這些值可以在擷取期間更改。 當修改參數 Seed2 時,所有三個參數的值都會被鎖存。 |
|
以下範例顯示了 operator PseudoRandomNumberGen 的使用方式:




上一頁

