2014-10-04 222 views
2

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

这里是我的代码:

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 
+0

你还没有告诉我们问题是什么。 – 2014-10-04 09:47:05

+0

对不起 - 问题是,我创建了一个无限循环。但我无法弄清楚在哪里。 – 2014-10-04 09:48:40

回答

3

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

解决办法:而不是仅仅存储原始值和比较random有一点,你需要保存至今走访每一个值的列表,当random出现在该列表中的任何位置结束。

+0

很酷,我解决了这个问题!非常感谢你的帮助! – 2014-10-04 12:19:51

+0

最受欢迎!现在您已经解决了这个问题,我建议您查看[中间方法](http://en.wikipedia.org/wiki/Middle-square_method)上的Wikipedia页面。它有一个整洁的Python实现,你可能想花时间去理解。我不知道代码修道院是否这样做,但我真的很喜欢欧拉工程让您访问论坛的方式 - 在您成功回答了一个问题之后 - 我用它作为了解更高效/优雅的机会解决我刚刚解决的问题。 – Daniel 2014-10-04 13:48:11