Operator PseudoRandomNumberGen

Operator Library: Base

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

为了进一步提高 random 质量,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() 函数。

VisualApplets Simulations with PseudoRandomNumberGen

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

I/O Properties

财产 值
操作员类型 O
Input Link I,数据输入
输出链接 O,数据输出

Supported Link Format

链接参数 输入链路 I 输出链路 O
Bit Width 任何1 [1, 64]2
Arithmetic {unsigned, signed} 未签名
Parallelism 任何 as I3
内核列 任何 1
内核行 任何 1
图像协议 {VALT_IMAGE2D、VALT_LINE1D、VALT_PIXEL0D、VALT_SIGNAL} as I
Color Format 任何 VAF_GRAY
颜色口味 任何 FL_NONE
Max. Img Width 任何 as I
Max. Img Height 任何 as I

1

对于无符号灰度值,输入 Bit Width 的范围是 [1, 64]。 对于有符号输入,范围是 [2, 64]。 对于无符号彩色输入,范围是 [3, 63],对于有符号彩色输入,范围是 [6, 63]。

2 3

参数

Min_LFSR_Length
键入 静态参数
默认 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 时,所有三个参数的值都会被锁存。

Examples of Use

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