鱼C论坛

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

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

[复制链接]
发表于 2021-5-14 17:44:42 | 显示全部楼层 |阅读模式
6鱼币
本帖最后由 zboyue 于 2021-5-14 17:48 编辑

用Python模拟羊车门问题来求概率

羊车门问题:有3扇关闭的门,一扇门后停着汽车,另外两扇门后是山羊,主持人知道每扇门后是什么。参赛者首先选择一扇门。在开启它之前,主持人会从另外两扇门中打开一扇门,露出门后的山羊。此时,允许参赛者更换自己的选择。请问,参赛者更换选择后,能否增加猜中汽车的机会?通过设计并编写程序验证,并给出自己的解释。


我的代码是
  1. import random
  2. ch_time = 0#change choice time
  3. chr_time = 0#change choice right
  4. nch_time = 0#not change
  5. nchr_time = 0#not change and right
  6. while True:
  7.     door = ['a', 'b', 'c']#三个门
  8.     choice = door[:]#door的复制,方便后面用
  9.     answer = random.choice(door)#随机一个有车的门
  10.     other = door.remove(answer)#剩下的就是有羊的门
  11.     choose1 = random.choice(choice)#随机选一个
  12.     wrong = random.choice(other)#主持人打开的有羊的门
  13.     choose2 = choice.remove(choose1, wrong)#改变选择的话的选择
  14.     if ch_time <= 5000:#if change
  15.         if choose2 == answer:
  16.             ch_time += 1
  17.             chr_time += 1
  18.             continue
  19.         else:
  20.             ch_time += 1
  21.             continue
  22.     else:#if not change
  23.         if choose1 == answer:
  24.             nch_time += 1
  25.             nchr_time += 1
  26.         if choose1 != answer:
  27.             nch_time += 1
  28.         if nch_time >= 5000:
  29.             break
  30. ch_result = chr_time/ch_time
  31. nch_result = nchr_time/nch_time
  32. print(ch_result,nch_result)
复制代码

但是报错了,报错如下

  1. Traceback (most recent call last):
  2.   File "C:\Users\zyydxjxj\Desktop\zby\操作题\羊车门问题.py", line 12, in <module>
  3.     wrong = random.choice(other)#主持人打开的有羊的门
  4.   File "C:\Users\zyydxjxj\AppData\Local\Programs\Python\Python39\lib\random.py", line 347, in choice
  5.     return seq[self._randbelow(len(seq))]
  6. TypeError: object of type 'NoneType' has no len()
  7. >>>
复制代码

我当时心里一万个mmp,诶?nonetype是在搞什么诶!(哭)

所以我就在shell里面逐行尝试代码,尝试去解决,尝试的结果如下

  1. >>> import random
  2. >>> door = ['a', 'b', 'c']
  3. >>> choice = door[:]
  4. >>> choice    #确认复制操作没问题
  5. ['a', 'b', 'c']
  6. >>> choice.append(1)   #依旧确认
  7. >>> choice
  8. ['a', 'b', 'c', 1]
  9. >>> door
  10. ['a', 'b', 'c']
  11. >>> choice.remove(1)  #确认完毕(小白嘛,谅解一下嘿嘿)
  12. >>> choice
  13. ['a', 'b', 'c']
  14. >>> answer = random.choice(door)   #选正确答案
  15. >>> other = door.remove(answer)   #那剩下的就是错误答案咯
  16. >>> other
  17. >>> print(other)
  18. None    #诶?........#$^%&%$*^$#^$
  19. >>> answer   #搞毛啊,明明answer没错
  20. 'c'
  21. >>> other = door.remove(answer)
  22. Traceback (most recent call last):
  23.   File "<pyshell#14>", line 1, in <module>
  24.     other = door.remove(answer)
  25. ValueError: list.remove(x): x not in list  #这说明成功从door里面移除了answer(刚才确认了
  26.                                               answer只是随机得到的'c'这一项)
  27. >>> #为毛移除了一项就变成了空了啊!!!就算是全部移除也应该是空列表也不是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函数也是这样的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2021-5-14 17:49:25 | 显示全部楼层
楼猪补充:我是智障,我找到插代码的方法了,我认罪,已经修改了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


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

改成

  1. door.remove(answer)
  2. other = door[:]
复制代码

试试吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-14 22:14:52 | 显示全部楼层
  1. import random
  2. ch_time = 0#change choice time
  3. chr_time = 0#change choice right
  4. nch_time = 0#not change
  5. nchr_time = 0#not change and right
  6. while True:
  7.     door = ['a', 'b', 'c']#三个门
  8.     choice = door.copy()#door的复制,方便后面用
  9.     answer = random.choice(door)#随机一个有车的门
  10.     door.remove(answer)
  11.     other = door#剩下的就是有羊的门
  12.     wrong = random.choice(other)  # 主持人打开的有羊的门
  13.     choice.remove(wrong)
  14.     choose1 = random.choice(choice)#随机选一个
  15.     choice.remove(choose1)  # 改变选择的话的选择
  16.     choose2 = choice
  17.     if ch_time <= 5000:#if change
  18.         if choose2 == answer:
  19.             ch_time += 1
  20.             chr_time += 1
  21.             continue
  22.         else:
  23.             ch_time += 1
  24.             continue
  25.     else:#if not change
  26.         if choose1 == answer:
  27.             nch_time += 1
  28.             nchr_time += 1
  29.         if choose1 != answer:
  30.             nch_time += 1
  31.         if nch_time >= 5000:
  32.             break
  33. ch_result = chr_time/ch_time
  34. nch_result = nchr_time/nch_time
  35. print(ch_result,nch_result)
复制代码

帮你改了一下,运行没报错,我也不知道你的输出是什么...你参考下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-15 02:33:29 | 显示全部楼层
好像要学习的东西还有很多
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

是的呀,唉
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

啊嘞!明白啦!谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 20:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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