我用Python编写了一个Monty Hall程序(这证明了2/3到1/3的机会),但当我用尽可能少的行编写时,(我个人的兴趣)我会出现这些神秘的错误!这是代码:
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: %inErrors: %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/except来计算使用以下代码的错误:
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: %inErrors: %i' %(t,m)
错误永远不会超过10%,但对我来说毫无意义!
要修复错误,所需要的就是定义
o = choice([x for x in abc if x not in [i,p]])
然后将相应的代码替换为o。
我知道代码很难阅读(有点不可能),但我很感激任何帮助/建议。
编辑:以下是变量的含义:i=初始门选择(随机)x=要打开的门(不是奖品,不是初始)y=要切换到的门(非x,不是初始的)abc=列表中只有A、B和Ct=总获胜m=神秘错误p=奖品(或"汽车")所在的门
更直接一点有什么错?
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)))
感谢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))