2014-10-04 220 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