鱼C论坛

 找回密码
 立即注册
查看: 4396|回复: 33

[技术交流] 小练习20160124:猜数----点评与结果

[复制链接]
发表于 2016-2-1 19:55:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2016-2-4 11:02 编辑

本次练习大家答题踊跃,很多人给出了优秀的答案。
这次评判的原则是在符合题意的答案中看谁的尝试次数最少,谁的用时最短。答案正确的结果如下:
ID
尝试次数
用时
zooo
5.807
0.7647
DingRan
5.803
0.4479
wei_Y
8.367
2.165
Lnan95
6.063
0.954
USTC-ssj
  1.495
落殇飞羽
5.688
0.5527
shuofxz
8.989
1.973
FDMa
5.808
0.4063
第一个答对的是 @zooo
结果最佳的是 @DingRan  和 @FDMa




@零度非安全 的作业也非常优秀,采用2分法,并给出了详尽的注释。但出现了一个小BUG,他也在比赛结束后发现了并改正,为确保对其他参赛者的公平,只好忍痛割爱了。对他这种认真精神也将予以鼓励。



本次活动的结果请大家点评,如果有异议请于2.3 22:00前提出。

===========================================================

最终结果,最佳奖 @DingRan  和 @FDMa,
第一答对奖 @zooo









第一个给出答案的是 @debi999
  1. import random
  2. #新建空列表,用于存放猜数字的记数
  3. count=[]

  4. #定义猜数字函数
  5. def funC():
  6.     a=int(random.uniform(1,100))
  7.     b=int(random.uniform(1,100))
  8.     for i in range(1,11):
  9.         if b==a:
  10.             break
  11.         else:
  12.             b=int(random.uniform(1,100))
  13.     count.append(int(i))

  14. #循环执行100000次   
  15. for j in range(0,100000):
  16.     funC()

  17. #定义猜中次数的计数器
  18. a1=0
  19. a2=0
  20. a3=0
  21. a4=0
  22. a5=0
  23. a6=0
  24. a7=0
  25. a8=0
  26. a9=0
  27. list1=[]

  28. #判断猜中次数
  29. for m in range(len(count)):
  30.     if count[m]==1:
  31.         a1+=1
  32.     elif count[m]==2:
  33.         a2+=1
  34.     elif count[m]==3:
  35.         a3+=1
  36.     elif count[m]==4:
  37.         a4+=1
  38.     elif count[m]==5:
  39.         a5+=1
  40.     elif count[m]==6:
  41.         a6+=1
  42.     elif count[m]==7:
  43.         a7+=1
  44.     elif count[m]==8:
  45.         a8+=1
  46.     elif count[m]==9:
  47.         a9+=1
  48. list1.extend([a1,a2,a3,a4,a5,a6,a7,a8,a9])

  49. #计算平均值
  50. sum= (a1+a2+a3+a4+a5+a6+a7+a8+a9)
  51. pjz=sum/(max(list1))

  52. #输出
  53. print('尝试 1 次猜中的有 %d 轮'%a1)
  54. print('尝试 2 次猜中的有 %d 轮'%a2)
  55. print('尝试 3 次猜中的有 %d 轮'%a3)
  56. print('尝试 4 次猜中的有 %d 轮'%a4)
  57. print('尝试 5 次猜中的有 %d 轮'%a5)
  58. print('尝试 6 次猜中的有 %d 轮'%a6)
  59. print('尝试 7 次猜中的有 %d 轮'%a7)
  60. print('尝试 8 次猜中的有 %d 轮'%a8)
  61. print('尝试 9 次猜中的有 %d 轮'%a9)
  62. print ('平均 %.3f 次猜中'%pjz)
复制代码


很遗憾虽然整体思路是对的,但有些错误没有完成题意的要求。
1.用两个随机数来确定答案和猜数,并反复随机猜数来使两者相等,这样效率不高,且只比较10次无法保证每轮都能猜出答案。
2.用random.uniform函数得到的是实数,虽然用int取整,一是效率低,二是数字不是完全随机分布,出现100的可能性太低。





评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zooo + 1 + 1 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2016-2-4 22:49:20 | 显示全部楼层
用random.randint(1,100)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-4 08:30:24 | 显示全部楼层
房间里的大象 发表于 2016-2-3 22:51
楼主,我做题的时候还没有学列表什么的,,所以只会一点点

慢慢来,即使比赛结束了,也可以自己逐步把它做好。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-3 22:51:03 | 显示全部楼层
冬雪雪冬 发表于 2016-2-1 21:21
这是 @房间里的大象 的答案。

也是用随机数作为猜数。可惜程序没有完成,建议参考其他人的答案自己再做 ...

楼主,我做题的时候还没有学列表什么的,,所以只会一点点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-2 21:17:27 | 显示全部楼层
冬雪雪冬 发表于 2016-2-2 16:25
这个游戏原来是计算机出一个数,由人来猜,每次提示大了小了或猜中。
现在改为程序来猜。如果不告诉大了 ...

嗯嗯~谁也没法保证出题时候都考虑周全呢。。总之还是学到不少。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-2 20:28:27 | 显示全部楼层
冬雪雪冬 发表于 2016-2-2 08:25
抱歉,在统计时疏忽了,已更正。

谢谢~辛苦辛苦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-2 17:10:25 | 显示全部楼层
冬雪雪冬 发表于 2016-2-2 16:54
碰巧可能一次就猜中,也有可能需要6、7次,为相对公平把100000轮游戏各需要几次猜中取平均值作为参数者的 ...

原来如此。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-2 16:54:13 | 显示全部楼层
swsfly 发表于 2016-2-2 16:39
我一直没有理解到,那个 “平均多少次猜对” 是个啥意思。。。平均数估计也不对。。

碰巧可能一次就猜中,也有可能需要6、7次,为相对公平把100000轮游戏各需要几次猜中取平均值作为参数者的成绩考量。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-2 16:39:21 | 显示全部楼层
冬雪雪冬 发表于 2016-2-1 21:34
这是 @swsfly 的答案。

也是采用随机数作为猜数,并使用了多级的if语句,但很遗憾只写到temp9没有给出全 ...

我一直没有理解到,那个 “平均多少次猜对” 是个啥意思。。。平均数估计也不对。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-2 16:25:23 | 显示全部楼层
65230215 发表于 2016-2-2 11:56
为啥要用次数最少来衡量结果呢?提出一点质疑
现实中猜数可不会告诉你大了小了。。。
二分法本身只是针对 ...

这个游戏原来是计算机出一个数,由人来猜,每次提示大了小了或猜中。
现在改为程序来猜。如果不告诉大了小了,那只好从1到100的试,太简单了,题目也就没有意义了。
从方法看,二分法是猜测的优选方法,比随机猜或从小到大一个个猜效率要高很多。
既然较好的程序都是用二分法,就看谁的次数最少,用时最短。
但在出题时没有说明这一点,可能有的鱼油没有在优化上做进一步的改进,这是我的疏忽。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-2 16:24:33 | 显示全部楼层
冬雪雪冬 发表于 2016-2-1 21:11
这是 @落殇飞羽 的答案:

@冬雪雪冬 这是错的,所以运行有问题

后面第二个算法不是正确的解法,严格来是曲解了题意:我以为是计算机直接随机,不排除错误答案,而直接生成一个100000个才的数,然后这个十万个猜数猜对了一共有多少个,而两个猜对的数之间有多少数就是重复了几次才。

但是这个理解方法是有问题的.....

所以才给出了上面使用二分法的方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-2 15:51:27 | 显示全部楼层
这个写了两天,没有写出来,来学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-2 11:56:20 | 显示全部楼层
为啥要用次数最少来衡量结果呢?提出一点质疑
现实中猜数可不会告诉你大了小了。。。
二分法本身只是针对这题目偷懒的一种做法吧。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-2 08:25:51 | 显示全部楼层
DingRan 发表于 2016-2-1 23:53
嘿嘿嘿求用俺第二版答案的结果呀~

抱歉,在统计时疏忽了,已更正。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-1 23:53:45 | 显示全部楼层
嘿嘿嘿求用俺第二版答案的结果呀~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-1 22:39:21 | 显示全部楼层
zooo 发表于 2016-2-1 22:29
发现我的第9行忘记用地板除了,影响了不少效率,优化程序中。。。

嗯,就是在不断的学习,不断的挑战自我中提高的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-1 22:29:24 | 显示全部楼层
发现我的第9行忘记用地板除了,影响了不少效率,优化程序中。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-1 22:04:53 | 显示全部楼层
Lnan95 发表于 2016-2-1 22:02
看来运行的速度也是个大学问啊

是的,算法优化可以使用最少的步骤最短的时间完成任务。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-1 22:02:39 | 显示全部楼层
看来运行的速度也是个大学问啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-1 21:55:46 | 显示全部楼层
黑龍 发表于 2016-2-1 20:53
楼主真是python大神。。我想用C写来着 不过发现C语言for到100000一运行就出了结果

黑龍 版主,我还不会C语言,以后有机会向你学习。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-30 08:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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