Neumann的随机生成器 - Python 3

时间:2014-10-04 09:42:46

标签: python python-3.x

我正在研究Code Abbey问题23,Neumann的随机生成器。目标是使用给定的算法从列表中的每个值生成一系列随机数,并继续直到算法产生与我们开始时相同的数字。然后,打印到达循环所需的通过次数。我似乎无法让我的代码工作;我很确定这与while循环有关。我会感谢任何帮助,更重要的是,解释我做错了什么。

这是我的代码:

cases = int(input())
values = [int(x) for x in input().split()]

def random_number(values):
    for value in values:
        random = pow(value, 2)
        passes = 0
        equal = False

        while not equal:

            if len(str(random)) < 8:
                random = int(str(random).zfill(8))

            random = (random // 100) % 10000

            passes += 1

            if random == value:
                equal = True
            else:
                random = pow(random, 2)

        print(passes, end=' ')

random_number(values)

这是我的意见:

12
6239 8935 4715 8785 9737 9251 3251 3544 9631 4655 903 7589

1 个答案:

答案 0 :(得分:3)

问题: 中间方法并不总是返回到起始种子,但这是您测试的唯一结果。序列可以返回除种子之外的某些已访问过的数字,在这种情况下random将永远不会等于value,并且您的程序将不会检测到重复。 (为了快速演示这一点,尝试手动执行算法,开始一个值12 - 你会发现它开始很快重复,但再也不会再次访问12)。

解决方案:不仅要存储原始值并将random与之进行比较,还需要存储目前已访问的每个值的列表,并在random时终止出现在该列表中的任何位置。