鱼C论坛

 找回密码
 立即注册
查看: 4010|回复: 15

[已解决]求助,求数的一个练习题,这样写不正确,求指点

[复制链接]
发表于 2016-1-28 15:20:47 | 显示全部楼层 |阅读模式

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

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

x



  1. import random
  2. secret = random.randint(1,100)
  3. time = 1
  4. while time <= 100000:
  5.     time = time + 1
  6.     time1 = 0
  7.     while True:
  8.         guess = random.randint(1,100)
  9.         time1 = time1 + 1
  10.         if guess == secret:
  11.             print(time1)
  12.         break
  13. if time1 == 1:
  14.     print('尝试1次猜中的有'+ time +'轮')
  15. elif time1 == 2:
  16.     print('尝试2次猜中的有'+ time +'轮')
  17. elif time1 == 3:
  18.     print('尝试3次猜中的有'+ time +'轮')
  19. elif time1 == 4:
  20.     print('尝试4次猜中的有'+ time +'轮')
  21. elif time1 == 5:
  22.     print('尝试5次猜中的有'+ time +'轮')
  23. elif time1 == 6:
  24.     print('尝试6次猜中的有'+ time +'轮')
  25. elif time1 == 7:
  26.     print('尝试7次猜中的有'+ time +'轮')
  27. elif time1 == 8:
  28.     print('尝试8次猜中的有'+ time +'轮')
  29. elif time1 == 9:
  30.     print('尝试9次猜中的有'+ time +'轮')
复制代码
最佳答案
2016-1-28 18:24:46
本帖最后由 Lnan95 于 2016-1-28 18:26 编辑

楼上说得挺好的
①个人觉得最后那一串if语句缩进有点问题,应该全部加一个tab,不然只能显示最后一次了。
②就是对于不知道实验次数要如何计数,可以选择字典的方式。"100000次中有y次在猜了x次后得到结果",以x作为key,y作为value,妈妈就不担心我试验次数有几次了。
③冬雪雪冬大大用的方法是二分法,能把试验次数控制得在10以内。
④至于想要每轮的secret不同,简单地把它移个位子就好了嘿嘿
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-28 17:37:27 | 显示全部楼层
你说的是 冬雪雪冬 的猜数吧
你的代码虽然循环了10000次但是只有最后一次的结果被记录下来了,
你的猜数完全就是随机猜,可能有两次猜的是一个数。像你这种猜法,很难九次内就猜中答案的
冬雪雪冬的题每轮 secret 是不同的,每轮都随机生成。而你的secret只有一个。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-28 18:24:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Lnan95 于 2016-1-28 18:26 编辑

楼上说得挺好的
①个人觉得最后那一串if语句缩进有点问题,应该全部加一个tab,不然只能显示最后一次了。
②就是对于不知道实验次数要如何计数,可以选择字典的方式。"100000次中有y次在猜了x次后得到结果",以x作为key,y作为value,妈妈就不担心我试验次数有几次了。
③冬雪雪冬大大用的方法是二分法,能把试验次数控制得在10以内。
④至于想要每轮的secret不同,简单地把它移个位子就好了嘿嘿
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-28 18:53:11 | 显示全部楼层
FDMa 发表于 2016-1-28 17:37
你说的是 冬雪雪冬 的猜数吧
你的代码虽然循环了10000次但是只有最后一次的结果被记录下来了,
你的猜数 ...

哦,要把这个secret也放到循环里面是吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-29 10:41:20 | 显示全部楼层
遇到问题不要直接放到网上来问,要学会自己debug,我写这道题的时候也犯了和你相同的问题,但可以通过对程序的调试把问题找出来,你可以用idle自己的debug,不过我用的时候确实感觉不太好用,就下了一个软件pycharm。
调试的时候你可以将你想要查看的参数的值添加进去,调试是手动一步一步往下进行的, 你就可以看出每一步相应的参数都是多少,也可以看出执行完某一语句后的下一语句是执行到了那里,这样可以很方便的找到问题的原因。
你的代码出现的问题,楼上已经说得很清楚了,你可以改完以后,用调试功能再检查相应的问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-29 10:46:50 | 显示全部楼层
time1 = 0需放到循环外面
要不然time1永远都是1


  1. import random
  2. secret = random.randint(1,100)
  3. time = 1
  4. time1 = 0
  5. while time <= 100000:
  6.     time = time + 1
  7.     while True:
  8.         guess = random.randint(1,100)
  9.         time1 = time1 + 1
  10.         if guess == secret:
  11.             print(time,time1)            
  12.             time1 = 0
  13.         break
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +1 收起 理由
hldh214 + 5 + 5 + 1

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-1-29 17:04:11 | 显示全部楼层
Lnan95 发表于 2016-1-28 18:24
楼上说得挺好的。
①个人觉得最后那一串if语句缩进有点问题,应该全部加一个tab,不然只能显示 ...

请问下,二分法是什么意思,刚开始学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-29 17:06:39 | 显示全部楼层
shuofxz 发表于 2016-1-29 10:41
遇到问题不要直接放到网上来问,要学会自己debug,我写这道题的时候也犯了和你相同的问题,但可以通过对程 ...

我也是下载了一个pycharm,但是还不懂怎么使用这个工具,现在只能用来运行代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-29 22:32:01 | 显示全部楼层
wangguohui 发表于 2016-1-29 17:04
请问下,二分法是什么意思,刚开始学习

这是数学上求解的方法哈,百科:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
举个例子:就是1到100,假设secret为50,第一次猜为5,猜小了,所以下次猜个(5+100)//2→52。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +1 收起 理由
hldh214 + 5 + 5 + 1 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-1-30 22:27:05 | 显示全部楼层
wangguohui 发表于 2016-1-29 17:06
我也是下载了一个pycharm,但是还不懂怎么使用这个工具,现在只能用来运行代码

要善用搜索工具哦,百度,google,上肯定能搜到使用方法的。
你也可以私信给我你的联系方式,我可以教你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-30 22:32:13 | 显示全部楼层
wangguohui 发表于 2016-1-29 17:04
请问下,二分法是什么意思,刚开始学习

二分法举个例子吧
比如数的范围从1-100,要猜测的数secret假如是62
令min=1, max=100  取中间值和secret比较   middle = (min+max)//2  
如果middle > secret 令max=middle
如果middle < secret 令min = middle
这个例子中middle = 50 < secret  , 所以令min = middle

然后一直重复上面的思路,直到middle = secret 循环结束
打印middle

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +1 收起 理由
hldh214 + 5 + 5 + 1 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-2-1 10:12:43 | 显示全部楼层
shuofxz 发表于 2016-1-30 22:27
要善用搜索工具哦,百度,google,上肯定能搜到使用方法的。
你也可以私信给我你的联系方式,我可以教你

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

使用道具 举报

发表于 2016-2-1 17:04:27 | 显示全部楼层
今天才看到题
我是新手,还没开始做,我说说我的想法吧
首先这个程序会包含几个模块
1.产生随机的目标数字
2.猜数字算法
3.记录猜数字结果

其中,产生随机数和之前做的让人来猜的没区别
猜数字算法准备用中间值
记录猜数字结果预计用个字典
key是单次猜的次数,比如猜了4次正确,value是这个次数的统计次数,比如50次
每次猜完数字拿到次数,在字典里搜索key,如果有,value+1,如果没有,增加这个key,初始value1
最后循环猜完总次数,打印出字典里的内容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-3 14:05:07 | 显示全部楼层
本帖最后由 aptdo 于 2016-2-3 14:06 编辑
  1. #encoding:utf-8

  2. #自动统计计算机自己猜数的次数

  3. import random
  4. import time

  5. def guess_num():
  6.     secret = random.randint(1,1024)
  7.     a =1
  8.     b = 1024
  9.     mid = (b-a+1)/2
  10.     global count
  11.     count = 0
  12.     while True:
  13.         count += 1
  14.         #print '第',count,'次'
  15.         if mid == secret:
  16.             #print secret,a, b ,mid
  17.             break
  18.         elif b-a == 2:
  19.             break
  20.         elif mid > secret:
  21.             b = mid
  22.             mid = (b-a+1)/2 +a
  23.             #print secret,a, b ,mid
  24.         elif mid < secret:
  25.             a =mid
  26.             mid = (b-a+1)/2 +a
  27.             #print secret,a, b ,mid
  28.    

  29. def test():
  30.     sample_size = 100000

  31.     i = 1
  32.     counts = []

  33.     while i<= sample_size:
  34.         i += 1
  35.         guess_num()
  36.         counts.append(count)
  37.     average = float(sum(counts))/sample_size
  38.     #print counts
  39.     print "总共进行了"+str(sample_size)+"次,平均用了:"+ str(average) +'次!'
  40.    

  41. start = time.time()
  42. test()
  43. end = time.time()

  44. elapsed = end - start
  45. print "Time taken: ", elapsed, "seconds."

  46. raw_input("已执行完成,按Enter键退出!") #双击执行时,可以让黑色命令行窗口停留,不会一闪而过
复制代码


执行结果:
总共进行了100000次,平均用了:9次!
Time taken:  0.405999898911 seconds.
已执行完成,按Enter键退出!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-4 09:49:47 | 显示全部楼层
新手不错啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-4 10:16:37 | 显示全部楼层

刚开始学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-19 10:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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