運算子 PseudoRandomNumberGen

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 of the Generator Random Numbers

偽隨機數產生器永遠無法產生真正的隨機值。 由於有效率的產生器實作以及加入了非確定性時序,所產生之值的 Quality 非常高。 以下將介紹對產生器進行的兩項測試結果,以證明實作的 Quality。

  1. 均勻分佈測試:

    產生一串 8 位元的隨機值並計算其平均值。平均值應該大約為 127.5。 從 LFSR 的理論中我們知道,序列始終是均勻分佈的(所有暫存器中的值為 0 的情況除外)。

    如果查看所產生值的直方圖(例如在 microDisplay 中),就可以看出均勻分佈。

  2. 頻譜測試:

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

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

使用 PseudoRandomNumberGen 的 VisualApplets 模擬

該運算子可以在 VisualApplets 中完全進行模擬。 然而,非確定性的硬體實作無法在模擬的軟體中實現。 因此,模擬中使用了 Quality 較差且非常簡單的隨機數產生器(MS VisualStudio 的 rand() 函式)。 如果種子未更改,運算子將始終產生相同的序列。

I/O Properties

Property Value
Operator Type O
Input Link I, data input
Output Link O, data output

支援的 Link 格式

Link Parameter Input Link I Output Link O
Bit Width any1 [1, 64]2
Arithmetic {unsigned, signed} unsigned
Parallelism any as I3
Kernel Columns any 1
Kernel Rows any 1
Img Protocol {VALT_IMAGE2D, VALT_LINE1D, VALT_PIXEL0D, VALT_SIGNAL} as I
Color Format any VAF_GRAY
Color Flavor any FL_NONE
Max. Img Width any as I
Max. Img Height any as I

1

對於無號灰階值,輸入 Bit Width 的範圍是 [1, 64]。 對於有號輸入,範圍是 [2, 64]。 對於無號彩色輸入,範圍是 [3, 63],而對於有號彩色,範圍是 [6, 63]。

2 3

參數

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 的使用方式: