Operator PseudoRandomNumberGen

Operator Library: Base

算子 PseudoRandomNumberGen 使用线性反馈移位寄存器 (LFSR) 生成 N 位随机数流。 这些 LFSR 会生成均匀分布的二进制随机序列。 随机序列重复前的长度由反馈移位寄存器的寄存器数量决定。 32 位长度的 LFSR 将生成长度为 2^32 - 2 个值的序列。 所实现的随机数 generator 使用不同的 LFSR 在算子输出端生成 N 位随机数。 这增加了序列长度并避免了各个位之间的相关性。 下图展示了伪随机数 generator 的实现方式。

为了进一步提高 random number Quality,LFSR 采用自由运行方式,不以像素频率作为时钟源。 因此,结果的时序具有非确定性,从而将真正的随机数引入了值生成中, 这显著提高了 Quality。

在 applet 初始化时,LFSR 会使用种子进行预初始化。 该种子在 VisualApplets 中使用参数 Seed0、Seed1 和 Seed2 进行定义。 在算子实例化时,将使用软件随机数 generator 来生成默认种子值。

用法

该算子支持不同的位宽和 Parallelism。 然而,对于高 Parallelism 和高位宽,需要消耗更多的资源。 可以通过输出 link 调整输出 Bit Width。

算子输入 link 仅用于同步。 输入 link 上的数据值不用于生成数据输出。

参数 Min_LFSR_Length 用于指定最短 LFSR 的长度。 每增加一个 LFSR,就会多添加一个寄存器级。 最大寄存器长度为 168。

为了减少算子所需的资源,请减小参数 Min_LFSR_Length。 如果使用多个具有相同 Min_LFSR_Length 的算子,它们将生成相同的序列。 如果种子不同,生成的序列仍然相同,只是序列的起点发生了变化。

Quality of the Generator Random Numbers

伪随机数 generator 永远无法生成真正的随机值。 由于高效的 generator 实现以及引入了非确定性时序,所生成值的 Quality 非常高。 以下展示了对该 generator 进行的两项测试结果,以证明其实现的 Quality。

  1. 等分布性测试:

    生成一串 8 位随机值并计算其平均值。平均值应在 127.5 左右。 从 LFSR 的理论可知,序列始终是等分布的(所有寄存器中的值全为 0 的情况除外)。

    如果查看生成值的直方图(例如在 microDisplay 中),可以看到均匀分布。

  2. 谱测试:

    谱测试用于检验 generator 的串行相关性。生成的序列中不应出现任何可见的规律。 劣质的 generator 在二维或三维空间中会表现出超平面。 VisualApplets generator 不会表现出任何超平面:

    下一张图展示了一个劣质 generator 的示例。 它是著名的 RANDU Generator,主要用于 C 编程语言中的 rand() 函数。

使用 PseudoRandomNumberGen 进行 VisualApplets 仿真

该算子可以在 VisualApplets 中进行完整仿真。 但是,非确定性的硬件实现无法在用于仿真的软件中实现。 因此,仿真中使用了 Quality 较差的非常简单的随机数 generator(MS VisualStudio 的 rand() 函数)。 如果不更改种子,算子将始终生成相同的序列。

I/O Property

Property 值
Operator Type O
Input Link I,数据输入
Output Link O,数据输出

Supported Link Format

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
键入 static 参数
默认 random
范围 [3, 168]

此参数指定最短 LFSR 的长度。 较大的值会导致更高的资源消耗。

请注意以下约束:

Seed0
键入 静态/动态读写参数
默认 random
范围 [0, 2^64 - 1]

如算子简介中所述,种子用于对 LFSR 进行预初始化。 在算子实例化时,这些值会使用软件生成的随机数进行初始化。 这些值可以在采集期间更改。 当修改参数 Seed2 时,所有三个参数的值都会被锁存。

Seed1
键入 静态/动态读写参数
默认 random
范围 [0, 2^64 - 1]

如算子简介中所述,种子用于对 LFSR 进行预初始化。 在算子实例化时,这些值会使用软件生成的随机数进行初始化。 这些值可以在采集期间更改。 当修改参数 Seed2 时,所有三个参数的值都会被锁存。

Seed2
键入 静态/动态读写参数
默认 random
范围 [0, 2^64 - 1]

如算子简介中所述,种子用于对 LFSR 进行预初始化。 在算子实例化时,这些值会使用软件生成的随机数进行初始化。 这些值可以在采集期间更改。 当修改参数 Seed2 时,所有三个参数的值都会被锁存。

使用示例

以下示例展示了算子 PseudoRandomNumberGen 的使用方法: