【问题标题】:Neumann's Random Generator - Python 3Neumann 的随机生成器 - Python 3
【发布时间】:2015-01-04 11:46:39
【问题描述】:

我正在研究 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

【问题讨论】:

  • 你还没有告诉我们问题出在哪里。
  • 抱歉 - 问题是,不知何故,我创建了一个无限循环。但我不知道在哪里。

标签: python python-3.x


【解决方案1】:

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

解决方案:您需要存储到目前为止访问过的每个值的列表,并在 random 出现在其中的任何位置时终止,而不是只存储原始值并将 random 与其进行比较列表。

【讨论】:

  • 非常欢迎!现在您已经解决了,我建议您查看middle-square method 上的维基百科页面。它有一个简洁的 Python 实现,您可能需要花时间来理解它。我不知道 Code Abbey 是否这样做,但我真的很喜欢 Project Euler 在您成功回答问题后让您访问论坛的方式 - 我以此为契机获得深入了解我刚刚解决的问题的更有效/优雅的解决方案。
猜你喜欢
  • 2016-07-17
  • 1970-01-01
  • 2021-07-27
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
相关资源
最近更新 更多