鱼C论坛

 找回密码
 立即注册
查看: 2158|回复: 7

[已解决]大佬们球球了,这个怎么回事啊

[复制链接]
发表于 2021-5-14 17:44:42 | 显示全部楼层 |阅读模式
6鱼币
本帖最后由 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[self._randbelow(len(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




  • 收起




[url=] 加粗[/url]
[url=] 下划线[/url]
[url=] 代码段[/url]
[url=] 有序[/url]
[url=] 无序[/url]
[url=] 图像
[/url]










最佳答案
2021-5-14 17:44:43
本帖最后由 弈秋呜呜呜 于 2021-5-14 20:38 编辑

我只是看了你注释的错误那里,我觉得你的错误在remove 函数是在原来列表的基础上修改的,它返回的是一个None值。所以你只需要 list.remove(value)就行,不用再赋值。sort函数也是这样的

最佳答案

查看完整内容

我只是看了你注释的错误那里,我觉得你的错误在remove 函数是在原来列表的基础上修改的,它返回的是一个None值。所以你只需要 list.remove(value)就行,不用再赋值。sort函数也是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-14 17:44:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 弈秋呜呜呜 于 2021-5-14 20:38 编辑

我只是看了你注释的错误那里,我觉得你的错误在remove 函数是在原来列表的基础上修改的,它返回的是一个None值。所以你只需要 list.remove(value)就行,不用再赋值。sort函数也是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-14 17:49:25 | 显示全部楼层
楼猪补充:我是智障,我找到插代码的方法了,我认罪,已经修改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-14 18:01:03 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-5-14 18:03 编辑
other = door.remove(answer)

这是在原列表直接操作的,没有返回值

改成
door.remove(answer)
other = door[:]
试试吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-14 22:14:52 | 显示全部楼层
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)
帮你改了一下,运行没报错,我也不知道你的输出是什么...你参考下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-15 02:33:29 | 显示全部楼层
好像要学习的东西还有很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-15 11:39:27 From FishC Mobile | 显示全部楼层
不自律的笨鸟 发表于 2021-5-15 02:33
好像要学习的东西还有很多

是的呀,唉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-15 11:40:58 From FishC Mobile | 显示全部楼层
弈秋呜呜呜 发表于 2021-5-14 20:35
我只是看了你注释的错误那里,我觉得你的错误在remove 函数是在原来列表的基础上修改的,它返回的是一个Non ...

啊嘞!明白啦!谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 21:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表