计算伪随机数发生器的周期性(中方法)

计算科学 Python 随机数生成
2021-12-23 18:45:43

下面是一个 Python 代码,它计算给定 4 位数字的中间平方方法的周期性:

n = int(input("Please enter a four digit number: "))
already_seen = list()
while n not in already_seen:
    already_seen.append(n)
    n = int(str(n * n).zfill(8)[2:6])
    print(n)
print('periodicity = ', len(already_seen) - already_seen.index(n))

例如,种子编号 9267 产生于进入周期为 4 [9267, ..., 6100, 2100, 4100, 8100, 6100, 2100, 4100, 8100, 6100, ...] 的短循环中的序列

是否有任何解决方案可以找出哪些数字会产生最长的周期性而无需模拟?如果没有,为什么没有解决方案?一般来说,是否有解决方案可以在不同的随机数生成器中找出给定种子的周期性?

1个回答

据我所知,没有,但也许这里的其他人更了解这个领域。我的知识主要来自开发物理学中的蒙特卡洛代码。

Knuth 在他的《计算机编程艺术》第 2 卷中指出,Metropolis 在 20 位上使用中间平方方法,发现该方法总是退化到 13 个周期,其中最长的周期为 142。一直找不到原始论文,但请注意,他仅指周期的周期,而不是从给定周期到达周期所需的时间。

更一般地说,当今数字中使用的大多数(但不是全部)随机数生成器都有一个保证周期,通常与种子无关。然而,这个周期的计算方式因发电机而异。有关合理的随机数生成器的列表,请参阅this 。

对于几乎所有现代随机数生成器来说,通过实验找到周期将非常困难,仅仅是因为周期非常长。在许多情况下,即使每个原子都变成一台计算机并行处理这个问题,它所花费的时间也远远超过宇宙的预期年龄。只是为了让您了解它的难度。

无论如何,对于玩具随机生成器,请记住,为了找到一个循环,您需要检查生成器的整个状态空间是否在重复。在中间平方方法的情况下,状态和输出是相同的,但对于大多数随机数生成器来说并非如此,当然对于任何实际的随机数生成器也不是这样。

PS:middle-square方法是一个非常糟糕的随机数生成器,不应该用于生成随机数。曾经。