大佬们球球了,这个怎么回事啊
本帖最后由 zboyue 于 2021-5-14 17:48 编辑用Python模拟羊车门问题来求概率
羊车门问题:有3扇关闭的门,一扇门后停着汽车,另外两扇门后是山羊,主持人知道每扇门后是什么。参赛者首先选择一扇门。在开启它之前,主持人会从另外两扇门中打开一扇门,露出门后的山羊。此时,允许参赛者更换自己的选择。请问,参赛者更换选择后,能否增加猜中汽车的机会?通过设计并编写程序验证,并给出自己的解释。
我的代码是import random
ch_time = 0#change choice time
chr_time = 0#change choice right
nch_time = 0#not change
nchr_time = 0#not change and right
while True:
door = ['a', 'b', 'c']#三个门
choice = door[:]#door的复制,方便后面用
answer = random.choice(door)#随机一个有车的门
other = door.remove(answer)#剩下的就是有羊的门
choose1 = random.choice(choice)#随机选一个
wrong = random.choice(other)#主持人打开的有羊的门
choose2 = choice.remove(choose1, wrong)#改变选择的话的选择
if ch_time <= 5000:#if change
if choose2 == answer:
ch_time += 1
chr_time += 1
continue
else:
ch_time += 1
continue
else:#if not change
if choose1 == answer:
nch_time += 1
nchr_time += 1
if choose1 != answer:
nch_time += 1
if nch_time >= 5000:
break
ch_result = chr_time/ch_time
nch_result = nchr_time/nch_time
print(ch_result,nch_result)但是报错了,报错如下Traceback (most recent call last):
File "C:\Users\zyydxjxj\Desktop\zby\操作题\羊车门问题.py", line 12, in <module>
wrong = random.choice(other)#主持人打开的有羊的门
File "C:\Users\zyydxjxj\AppData\Local\Programs\Python\Python39\lib\random.py", line 347, in choice
return seq
TypeError: object of type 'NoneType' has no len()
>>>
我当时心里一万个mmp,诶?nonetype是在搞什么诶!(哭)所以我就在shell里面逐行尝试代码,尝试去解决,尝试的结果如下>>> import random
>>> door = ['a', 'b', 'c']
>>> choice = door[:]
>>> choice #确认复制操作没问题
['a', 'b', 'c']
>>> choice.append(1) #依旧确认
>>> choice
['a', 'b', 'c', 1]
>>> door
['a', 'b', 'c']
>>> choice.remove(1)#确认完毕(小白嘛,谅解一下嘿嘿)
>>> choice
['a', 'b', 'c']
>>> answer = random.choice(door) #选正确答案
>>> other = door.remove(answer) #那剩下的就是错误答案咯
>>> other
>>> print(other)
None #诶?........#$^%&%$*^$#^$
>>> answer #搞毛啊,明明answer没错
'c'
>>> other = door.remove(answer)
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
other = door.remove(answer)
ValueError: list.remove(x): x not in list#这说明成功从door里面移除了answer(刚才确认了
answer只是随机得到的'c'这一项)
>>> #为毛移除了一项就变成了空了啊!!!就算是全部移除也应该是空列表也不是nonetype啊喂!!凸(艹皿艹 )我的尝试结果还有思考的过程全部在注释里面啦,大佬们球球了!!!!小白无能狂怒对了,顺便问一句,鱼c论坛的话,可以像CSDN那样插代码嘛?我找了半天没找到,就只好用引用来插代码了wwwww
[*]收起
加粗 下划线 代码段 有序 无序 图像
本帖最后由 弈秋呜呜呜 于 2021-5-14 20:38 编辑
我只是看了你注释的错误那里,我觉得你的错误在remove 函数是在原来列表的基础上修改的,它返回的是一个None值。所以你只需要 list.remove(value)就行,不用再赋值。sort函数也是这样的 楼猪补充:我是智障,我找到插代码的方法了,我认罪,已经修改了{:10_266:} 本帖最后由 qq1151985918 于 2021-5-14 18:03 编辑
other = door.remove(answer)
这是在原列表直接操作的,没有返回值
改成
door.remove(answer)
other = door[:]
试试吧 import random
ch_time = 0#change choice time
chr_time = 0#change choice right
nch_time = 0#not change
nchr_time = 0#not change and right
while True:
door = ['a', 'b', 'c']#三个门
choice = door.copy()#door的复制,方便后面用
answer = random.choice(door)#随机一个有车的门
door.remove(answer)
other = door#剩下的就是有羊的门
wrong = random.choice(other)# 主持人打开的有羊的门
choice.remove(wrong)
choose1 = random.choice(choice)#随机选一个
choice.remove(choose1)# 改变选择的话的选择
choose2 = choice
if ch_time <= 5000:#if change
if choose2 == answer:
ch_time += 1
chr_time += 1
continue
else:
ch_time += 1
continue
else:#if not change
if choose1 == answer:
nch_time += 1
nchr_time += 1
if choose1 != answer:
nch_time += 1
if nch_time >= 5000:
break
ch_result = chr_time/ch_time
nch_result = nchr_time/nch_time
print(ch_result,nch_result)
帮你改了一下,运行没报错,我也不知道你的输出是什么...你参考下 好像要学习的东西还有很多 不自律的笨鸟 发表于 2021-5-15 02:33
好像要学习的东西还有很多
是的呀,唉 弈秋呜呜呜 发表于 2021-5-14 20:35
我只是看了你注释的错误那里,我觉得你的错误在remove 函数是在原来列表的基础上修改的,它返回的是一个Non ...
啊嘞!明白啦!谢谢!
页:
[1]