2017-10-16 98 views
-3

我在Python中製作了一個可以工作的Monty Hall程序(這證明了2/3到1/3的機會),但是當我在儘可能少的行中創建時,我的)我得到這些神祕的錯誤!下面是代碼:Monty Hall中的神祕錯誤Python代碼

from random import * 
i,a,abc,t,m=choice(['A','B','C']),raw_input('Switch? (y/n): ').upper(),['A','B','C'],0,0 
for j in range(100): 
    p = choice(abc) 
    if ([y for y in abc if y not in [i,(choice([x for x in abc if x not in [i,p]]))]][0] if a == 'Y' else i) == p : t += 1 
print 'WP: %i\nErrors: %i' %(t,m) 

我收到此錯誤:

Traceback (most recent call last): 
    File "fewlinesMonty.py", line 5, in <module> 
    if ([y for y in abc if y not in [i,(choice([x for x in abc if x not in [i,p]]))]][0] if a == 'Y' else i) == p : t += 1 
IndexError: list index out of range 

所以,我用一個try /除了使用該代碼計算錯誤:

from random import * 
i,a,abc,t,m=choice(['A','B','C']),raw_input('Switch? (y/n): ').upper(),['A','B','C'],0,0 
for j in range(100): 
    p = choice(abc) 
    try: 
     if ([y for y in abc if y not in [i,(choice([x for x in abc if x not in [i,p]]))]][0] if a == 'Y' else i) == p : t += 1 
    except: m += 1 
print 'WP: %i\nErrors: %i' %(t,m) 

的錯誤從不超過10%,但對我來說毫無意義!

修正錯誤,所有必要的是,以限定

o = choice([x for x in abc if x not in [i,p]]) 

,然後用鄰替換相應的代碼。

我知道代碼很難(有點不可能)閱讀,但我很感激任何幫助/建議。

編輯: 這裏有什麼變數的意思是: I =初始門的選擇(隨機)X =門打開(沒有獎金,沒有初始)Y =門切換到(不是X,而不是初始) abc =只是AB和C在列表中t =總勝數m =神祕錯誤p =獎品(或'汽車')的門是

+1

歡迎來到StackOverflow。請閱讀[如何提出一個好問題](https://stackoverflow.com/help/how-to-ask)。 – Spinor8

+1

而且......我的頭疼。繼續... – Mangohero1

+2

當你在一行中有7個括號和圓括號 - ']]))]] [' - 你不會寫可理解的代碼。不要試圖把所有這些東西放到一條線上。 – user2357112

回答

0

稍微直截了當的問題是什麼?

from random import choice 
initial_guess, flip, wins=choice('ABC'),input('Switch? (y/n): ').upper()=="Y",0 
for _ in range(100): 
    actual_winner = choice('ABC') 
    wins += 1 if (initial_guess == actual_winner and not flip) or (flip and initial_guess != actual_winner) else 0 

print("WP: ", wins) 

運行1

Switch? (y/n): y 
WP: 62 

運行2

Switch? (y/n): n 
WP: 31 

如果你真的想最少線:

from random import choice 
initial_guess, flip = choice('ABC'), input('Switch? (y/n): ') in ['y','Y'] 
print("WP: ", sum([[0,1],[1,0]][flip][initial_guess==choice('ABC')] for _ in range(100))) 
+0

非常感謝!另外,對於不注意每個變量的含義,我將它們分別設爲1個字符,以便可以同時看到整行。無論如何,在這裏他們(雖然你已經知道了):我=最初的門選擇(隨機) – WillH

+0

哎呦,並不意味着要添加最後兩行(我的編輯沒有保存)。感謝您瞭解他們的意思! – WillH

+0

另外,你有變量'flip'作爲輸入,它應該是一個raw_input。儘管偉大的工作! – WillH

0

感謝RobertB爲搞清楚了這一點,在這裏它是:(我做了一些未成年人編輯)

from random import choice 
initial_guess, flip = choice('ABC'), raw_input('Switch? (y/n): ') in ['y','Y'] 
print "WP: " , sum([[0,1],[1,0]][flip][initial_guess==choice('ABC')] for i in range(100))