鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 冬雪雪冬

[技术交流] 小练习20160124:猜数

[复制链接]
发表于 2016-1-27 18:02:26 | 显示全部楼层

回帖奖励 +3 鱼币

本帖最后由 落殇飞羽 于 2016-1-28 23:12 编辑

几乎把毕生所学都用上了......醉了,一个个问题也是被解决.....重新复习了,列表,元组,字典的数据读取和存储........

心累,但很高兴!!!

请版主检查并拍砖!!!!


老代码存在问题,我对题目的理解不对,所以重写了程序!!!

  1. #取得中位数
  2. def two_split(first, last):

  3.     mid = (first + last) // 2

  4.     return mid
  5.    



  6.   
  7. def compare(answer, guess, count1, count2, first1, last1):

  8.     #得到每轮猜中的次数,并放入列表
  9.     if guess == answer:
  10.         count1 += 1
  11.         #print(count2)
  12.         list2.append(count2)
  13.         
  14.         
  15.         
  16.         
  17.     #传入两个交换变量first1,last1以保存上一轮的列表中间数
  18.     elif guess > answer:
  19.         count2 += 1
  20.         if first1 == 0:
  21.             first1 = first
  22.             last1 = guess
  23.         else:
  24.             first1 = first1
  25.             last1 = guess
  26.             

  27.            
  28.         guess = two_split(first1, last1)
  29.         #print(guess)
  30.         compare(answer, guess, count1, count2, first1, last1)

  31.     else:
  32.         count2 += 1
  33.         if last1 == 0:
  34.             first1 = guess
  35.             last1 = last
  36.         else:
  37.             first1 = guess
  38.             last1 = last1


  39.         guess = two_split(first1, last1)
  40.         #print(guess)
  41.         compare(answer, guess, count1, count2, first1, last1)

  42.    

  43. import random

  44. sum1 = sum0 = 0
  45. i = 0
  46. first = 1
  47. last = 100

  48. first1 = 0
  49. last1 = 0

  50. count1 = 0 #记录一轮猜中的次数
  51. count2 = 1 #记录猜中的轮数



  52. list1 = [1,100]
  53. global list2
  54. list2 = []


  55. dic1 = {}

  56. while i < 100000:

  57.    
  58.     answer = random.randint(1,100)
  59.     if answer in list1:
  60.         guess = random.randint(1,2)
  61.         list2.append(guess)
  62.         #print(answer, guess)
  63.     else:
  64.         guess = two_split(first, last)
  65.         #print(answer, guess)
  66.         compare(answer, guess, count1, count2, first1, last1)
  67.     i += 1


  68. #把次数和轮数对应起来
  69. for each_1 in list2:
  70.    
  71.     if each_1 not in dic1:
  72.         dic1[each_1] = 1
  73.     else:
  74.         dic1[each_1] += 1
  75.         
  76. #print(list2)
  77. #按照key的从小到大排列输出次数与对应轮数
  78. list3 = list(dic1)
  79. list3.sort()

  80. for each_2 in list3:
  81.     print('尝试%d次实验猜对的有%d轮'%(each_2, dic1[each_2]))
  82.     sum0 = each_2 * dic1[each_2]
  83.     sum1 += int(sum0)

  84. print('平均%f次猜中'%(sum1/100000))
  85.    
复制代码

-----------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------
  1. import random

  2. answer = random.randint(1,100)

  3. count = 0

  4. count1 = 0 #count1统计每一轮出现所有猜对的次数
  5. count2 = 1 #count2统计每轮猜对之前所实验的次数
  6. count3 = 1 #count3统计实验次数相等的轮数
  7. count4 = 0 #count4统计所有猜对的轮数
  8. count5 = 0 #count5统计所有猜的次数之和

  9. list1 = []#列表放置10000个所猜的数
  10. list2 = []#列表放置每次猜中之前的次数
  11. list3 = []#列表放置排序后的key值


  12. #形成一个100000所猜数的列表
  13. while count < 100000:
  14.     number = random.randint(1,100)
  15.     list1.append(number)
  16.     count += 1

  17. #将实验次数与猜中的轮数对应放入一个字典
  18. dic1 = {}

  19. i = 0
  20. while i < 100000:
  21.     if list1[i] == answer:
  22.         
  23.         count4 += 1
  24.         count1 += 1
  25.         count5 += count2
  26.         list2.append(count2)
  27.         count1 = 0
  28.         count2 = 0
  29.         
  30.     else:
  31.         count2 += 1
  32.     i += 1

  33. for each_1 in list2:
  34.     if each_1 not in dic1:
  35.         dic1[each_1] = 1
  36.         
  37.     else:
  38.         count3 += 1
  39.         dic1[each_1] = count3


  40. #按照key的从小到大排列输出次数与对应轮数
  41. list3 = list(dic1)
  42. list3.sort()

  43. for each_2 in list3:
  44.     print('尝试%d次实验猜对的有%d轮'%(each_2, dic1[each_2]))



  45. print('共猜对%d轮'%count4)
  46. if count4 != 0:
  47.     print('平均每轮猜中需要%d次'%(count5/count4))

  48. #print(list1)
  49. print(answer)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-27 18:04:24 | 显示全部楼层

回帖奖励 +3 鱼币

零度非安全 发表于 2016-1-27 15:21
我有一个问题,就是你给的例子为什么猜的次数这么有规则???

因为楼主用的是二分法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-28 09:32:12 | 显示全部楼层
请问真的没出错题吗?
如果random范围是1,到100的话,不可能1-9次猜中有那么高的概率
搜狗截图16年01月28日0927_1.png

我觉得要出现事例里面那么高的概率应该是从1到10 猜数(代码如下)
  1. import random
  2. N = 0
  3. guess = 0
  4. G1 = G2 = G3 = G4 = G5 = G6 = G7 = G8 = G9 = 0
  5. SUM = 0

  6. while N < 100000:
  7.     AAA = random.randint(1,10)
  8.     N += 1
  9.     i =0
  10.    
  11.     while guess != AAA:
  12.         SUM += 1
  13.         i += 1
  14.         guess = random.randint(1,10)
  15.         
  16.     if i == 1:
  17.         G1 += 1
  18.         
  19.     elif i == 2:
  20.         G2 += 1
  21.         
  22.     elif i == 3:
  23.         G3 += 1
  24.         
  25.     elif i == 4:
  26.         G4 += 1
  27.         
  28.     elif i == 5:
  29.         G5 += 1
  30.         
  31.     elif i == 6:
  32.         G6 += 1
  33.         
  34.     elif i == 7:
  35.         G7 += 1
  36.         
  37.     elif i == 8:
  38.         G8 += 1
  39.         
  40.     elif i == 9:
  41.         G9 += 1

  42. print('尝试1次猜中的有', G1, '轮')
  43. print('尝试2次猜中的有', G2, '轮')
  44. print('尝试3次猜中的有', G3, '轮')
  45. print('尝试4次猜中的有', G4, '轮')
  46. print('尝试5次猜中的有', G5, '轮')
  47. print('尝试6次猜中的有', G6, '轮')
  48. print('尝试7次猜中的有', G7, '轮')
  49. print('尝试8次猜中的有', G8, '轮')
  50. print('尝试9次猜中的有', G9, '轮')

  51. print('平均', round(SUM/100000, 3), '次猜中')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-28 11:03:35 | 显示全部楼层
之前想的太简单,这回用二分法做的,猜测次数明显减少
  1. import random
  2. SUM = 0
  3. result = [0,0,0,0,0,0,0,0,0,0]
  4. N = 0

  5. while N < 100001:
  6.     N += 1
  7.     AAA = random.randint(1,100)
  8.     i =0
  9.     MIN = 1
  10.     MAX = 100
  11.    
  12.     while (MIN+MAX)//2 != AAA:
  13.         SUM += 1
  14.         i += 1
  15.         if (MIN+MAX)//2 < AAA:
  16.             MIN = (MIN+MAX)//2
  17.         else:
  18.             MAX = (MIN+MAX)//2
  19.     result[i] += 1

  20.         
  21. for i in range(0,10):
  22.     print('尝试%d次猜中的有 %3d 轮'%(i+1,result[i]))

  23. print('平均', round(SUM/100000, 3), '次猜中')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-28 16:50:43 | 显示全部楼层
  1. import random
  2. x=random.randint(1,100)
  3. n=100000
  4. a=0
  5. while n:
  6.         import random
  7.         y=random.randint(1,100)
  8.         if x==y:
  9.                 a=a+1
  10.         n=n-1
  11. print ('尝试1次猜测的有  '+a' 轮')
复制代码


现在只会这么多,再琢磨琢磨
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-28 19:08:20 | 显示全部楼层
  1. def guess(sre = 10):
  2.         time = 0
  3.         low = 0
  4.         high = 100
  5.         ges = (low + high) // 2
  6.         while ges != sre:
  7.                 if ges == 99:
  8.                         ges = 100
  9.                 elif ges > sre:
  10.                         high = ges
  11.                         ges = (low + ges) // 2
  12.                 else:
  13.                         low = ges
  14.                         ges = (high + ges) // 2
  15.                 time += 1
  16.         return time

  17. result_time = [0] * 8
  18. for i in range(100000):
  19.     sre = random.randint(1,100)
  20.     result_time[guess(sre)] += 1
  21. out = '''尝试 1 次猜中的有 {num1} 轮
  22. 尝试 2 次猜中的有 {num2} 轮
  23. 尝试 3 次猜中的有 {num3} 轮
  24. 尝试 4 次猜中的有 {num4} 轮
  25. 尝试 5 次猜中的有 {num5} 轮
  26. 尝试 6 次猜中的有 {num6} 轮
  27. 尝试 7 次猜中的有 {num7} 轮
  28. 尝试 8 次猜中的有 {num8} 轮
  29. 平均 {avg} 次猜中'''.format(num1=result_time[0], num2=result_time[1], num3=result_time[2], num4=result_time[3],
  30.                        num5=result_time[4], num6=result_time[5], num7=result_time[6], num8=result_time[7],
  31.                        avg=round(sum((i[0]+1)*i[1] for i in enumerate(result_time))/100000 , 3))
  32. print(out)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
冬雪雪冬 + 5 + 5 + 5 最佳奖

查看全部评分

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

使用道具 举报

发表于 2016-1-29 00:21:21 | 显示全部楼层
  1. import random as r

  2. def one_round():
  3.     '''
  4.     输出一个数:计算机猜中需要尝试的次数
  5.     '''
  6.     ans = r.randint(0, 100)
  7.     guess = r.randint(0, 100)
  8.     try_time = 0

  9.     while 1:
  10.         try_time += 1
  11.         
  12.         if guess == ans:
  13.             return try_time
  14.             
  15.         elif guess > ans:
  16.             guess = r.randint(ans, guess)
  17.         
  18.         elif guess < ans:
  19.             guess = r.randint(guess, ans)
  20.            
  21. def computer_play_game():
  22.     d = dict()

  23.     for i in range(100000):
  24.         try_time = one_round()
  25.         try:
  26.             d[try_time] += 1
  27.         except:
  28.             d[try_time] = 1
  29.             
  30.     for key in d:
  31.         print('小机机尝试了 %d 次猜中的有 %d 轮' %(key, d[key]))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-29 12:16:04 | 显示全部楼层
本帖最后由 kunaiai 于 2016-1-29 12:18 编辑
  1. import random
  2. secret = random.randint(1,100)
  3. time = 1
  4. time1 = 0
  5. res = []
  6. while time <= 100000:
  7.     guess = random.randint(1,100)
  8.     time1 += 1
  9.     if guess == secret:
  10.         res.append(time1);
  11.         time1 = 0
  12.         secret = random.randint(1,100)
  13.      
  14.     time += 1

  15. allRes = 0
  16. for i in res:
  17.     allRes += i

  18. count = len(res)
  19. print('共猜中%d,平均%.3f轮猜中'%(count,allRes/count))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-31 14:04:44 | 显示全部楼层
答案   答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-31 17:19:58 | 显示全部楼层
本帖最后由 swsfly 于 2016-1-31 17:39 编辑
  1. import random
  2. secret = random.randint(1,100)
  3. count1 = count2 = count3 = count4 = count5 = count6 = count7 = count8 = count9 =0
  4. for i in range (100000):
  5.     temp1 = random.randint(1,100)
  6.     guess1 = int(temp1)
  7.     if guess1 == secret:
  8.         count1 =count1 +1
  9.     else:
  10.         temp2 = random.randint(1,100)
  11.         guess2 = int(temp2)
  12.         if guess2 == secret:
  13.             count2 = count2 + 1
  14.         else:
  15.             temp3 = random.randint(1,100)
  16.             guess3 = int(temp3)
  17.             if guess3 == secret:
  18.                 count3 = count3 + 1
  19.             else:
  20.                 temp4 = random.randint(1,100)
  21.                 guess4 = int(temp4)
  22.                 if guess4 == secret:
  23.                     count4 = count4 + 1
  24.                 else:
  25.                     temp5 = random.randint(1,100)
  26.                     guess5 = int(temp5)
  27.                     if guess5 == secret:
  28.                         count5 = count5 + 1
  29.                     else:
  30.                         temp6 = random.randint(1,100)
  31.                         guess6 = int(temp6)
  32.                         if guess6 == secret:
  33.                             count6 = count6 + 1
  34.                         else:
  35.                             temp7 = random.randint(1,100)
  36.                             guess7 = int(temp7)
  37.                             if guess7 == secret:
  38.                                 count7 = count7 + 1
  39.                             else:
  40.                                  temp8 = random.randint(1,100)
  41.                                  guess8 = int(temp8)
  42.                                  if guess8 == secret:
  43.                                       count8 = count8 + 1
  44.                                  else:
  45.                                       temp9 = random.randint(1,100)
  46.                                       guess9 = int(temp9)
  47.                                       if guess9 == secret:
  48.                                          count9 = count9 + 1

  49. a=100000/(count1+count2+count3+count4+count5+count6+count7+count8+count9)
  50. print("尝试1次猜中的有 ",count1,'轮')
  51. print("尝试2次猜中的有 ",count2,'轮')
  52. print("尝试3次猜中的有 ",count3,'轮')
  53. print("尝试4次猜中的有 ",count4,'轮')
  54. print("尝试5次猜中的有 ",count5,'轮')
  55. print("尝试6次猜中的有 ",count6,'轮')
  56. print("尝试7次猜中的有 ",count7,'轮')
  57. print("尝试8次猜中的有 ",count8,'轮')
  58. print("尝试9次猜中的有 ",count9,'轮')
  59. print("平均",a,'次猜中')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-4 00:06:53 | 显示全部楼层
本帖最后由 aptdo 于 2016-2-4 11:40 编辑

刚看到题目,也写一个,我取的范围是(1,2**7),也就是1~128,max是2的几次方最大次数就是2的次方数。如果是1~129,那么猜的最大次数就是8次
============ RESTART: C:\Users\Aptdo\Desktop\Auto_guessnum.py ============
尝试1次就猜中的有:796轮
尝试2次就猜中的有:1617轮
尝试3次就猜中的有:3069轮
尝试4次就猜中的有:6205轮
尝试5次就猜中的有:12524轮
尝试6次就猜中的有:24864轮
尝试7次就猜中的有:50925轮
总共进行了100000次,平均用了:6.06336次!
Time taken:  0.349999904633 seconds.
已执行完成,按Enter键退出!



  1. #encoding:utf-8

  2. #自动统计计算机自己猜数的次数
  3. #部分调试时的语句注释掉了

  4. import random
  5. import time

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

  28. def main():
  29.     sample_size = 100000

  30.     i = 1
  31.     counts = []

  32.     while i<= sample_size:
  33.         i += 1
  34.         guess_num(1,2**7)
  35.         counts.append(count)
  36.     average = float(sum(counts))/sample_size
  37.     for i in range(min(counts),max(counts)+1):
  38.         print '尝试%s次就猜中的有:%s轮'%(i,counts.count(i))
  39.         
  40.     print "总共进行了"+str(sample_size)+"次,平均用了:"+ str(average) +'次!'
  41.    

  42. start = time.time()
  43. main()
  44. end = time.time()

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

  47. raw_input("已执行完成,按Enter键退出!") #双击执行时,可以让黑色命令行窗口停留,不会一闪而过
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-4 11:43:13 | 显示全部楼层
http://bbs.fishc.com/thread-41767-1-1.html

这个里面的第5题是不是和这一题一样呢
NO.5
有栋建筑物高100层。若从第N层或更高的楼层扔下来,鸡蛋就会破掉。若从第N层以下的楼层扔下来则不会破掉。给你2个鸡蛋,请找出N,并要求最差情况下扔鸡蛋的次数为最少。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-6 11:35:07 | 显示全部楼层
这个easy了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-8 21:22:26 | 显示全部楼层
我去,好难。。。
我只做到了循环,但是如何计算统计每一轮的次数,这边就不会了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-9 12:44:26 | 显示全部楼层
好的,我也来试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-20 13:45:27 | 显示全部楼层
发现大神什么的好多啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-28 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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