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 的算子,它们将生成相同的序列。 如果种子不同,生成的序列仍然相同,只是序列的起点发生了变化。
伪随机数 generator 永远无法生成真正的随机值。 由于高效的 generator 实现以及引入了非确定性时序,所生成值的 Quality 非常高。 以下展示了对该 generator 进行的两项测试结果,以证明其实现的 Quality。
-
等分布性测试:
生成一串 8 位随机值并计算其平均值。平均值应在 127.5 左右。 从 LFSR 的理论可知,序列始终是等分布的(所有寄存器中的值全为 0 的情况除外)。
如果查看生成值的直方图(例如在 microDisplay 中),可以看到均匀分布。

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


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

该算子可以在 VisualApplets 中进行完整仿真。 但是,非确定性的硬件实现无法在用于仿真的软件中实现。 因此,仿真中使用了 Quality 较差的非常简单的随机数 generator(MS VisualStudio 的 rand() 函数)。 如果不更改种子,算子将始终生成相同的序列。
| 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 时,所有三个参数的值都会被锁存。 |
|




上一页

