我了解 3D 超平面可以表示由线性同余生成器生成的数字。但我不明白它如何确定每个数字或点的位置。尤其是在 3D 立方体中?我的意思是,一个点不是必须有 X、Y 和 Z 值吗?如果生成的数字之一是“8”怎么办?只是“8”……我怎么知道 XYZ 呢?(我希望你知道我在说什么......无法发布图片,抱歉:/)
1 回答
假设您从线性同余生成器按顺序生成三个伪随机数的批次,并使用每个批次中的第一个数字作为 x 维度,下一个作为 y 维度,最后一个作为 z 维度,您可以然后在 xyz 立方体中绘制每批三个伪随机数。类似的论点适用于生成n ( n > 3) 个数字的批次,除非您将它们绘制在超立方体中。
假设您正在使用b位生成每个伪随机数。然后必须生成 2 nb个可能的数字来填充(超)立方体(对于b的任何典型值,这将是一个非常大的数字)。但是,如果生成器的周期小于 2 nb(实际情况几乎总是如此),它不会填满立方体(或超立方体,如果n > 3)中的所有可用空间。它只会填充一些空间。
更重要的是,填充的空间可能位于穿过(超)立方体的平面(或超平面,如果n > 3)中,(超)平面之间的空间代表生成器永远不会产生的数字,因为它重复它的周期从未产生过这样的数字。这是因为伪随机数是串行相关的。您可以在任何维度上看到这种行为,但是伪随机数所在的(超)平面的数量随着维度n的增加而减少,因此随着n的增大,这种行为变得更加明显。
当使用生成的伪随机数作为模拟的输入时,这可能是一个特殊的问题,因为模拟可以产生的输出更多是伪随机数的缺陷而不是模拟模型的结果。
关于线性同余生成器的维基百科文章非常好。
(编辑添加一个例子)
这是一个用 Python 实现的线性同余生成器(故意选择了非常差的参数)。具有偶数索引的伪随机数分配给 x 值,而具有奇数的伪随机数分配给 y 值。
import matplotlib.pyplot as plt
def lcg (X, a, c, m):
return (a * X + c) % m;
x = []
y = []
X = 0
for i in range(1000):
X = lcg(X,43,5,256)
if i % 2 == 0:
x.append(X)
else:
y.append(X)
plt.scatter(x,y)
plt.show()
此脚本产生以下输出:
您可以看到生成的 (x,y) 对都在少量直线上找到,并且生成器永远无法生成出现在直线之间的对。同样的事情可以在三个或更多维度上完成,以查看具有比我在这里使用的更好参数的生成器如何仍然产生位于 2、3 或n维空间中的线、平面或超平面上的输出。