问答题 2.  10个房间里放着数量随机的金币。每个房间只能进入一次,并只能在一个房间中拿金币。一个人采取如下策略:前4个房间只看不拿。随后的房间只要看到比前4个房间都多的金币数,就拿。否则就拿最后一个房间的金币。编程计算这种策略拿到最多金币的概率。
【正确答案】这道题要求一个概率的问题,由于10个房间里放的金币的数量是随机的,因此,在编程实现的时候首先需要生成10个随机数来模拟10个房间里金币的数量。然后判断通过这种策略是否能邑拿到最多的金币。如果仅仅通过一次模拟来求拿到最多金币的概率显然是不准确的,那么就需要进行多次模拟,通过记录模拟的次数m,拿到最多金币的次数n,从而可以计算出拿到最多金币的概率n/m。显然这个概率与金币的数量以及模拟的次数有关系。模拟的次数越多越能接近真实值。下面以金币数为1到10的随机数,模拟次数为1000次为例给出实现代码:
   import random
   
   """
   方法功能: 总共n个房间, 判断用指定的策略是否能拿到最多金币
   返回值: 如果能拿到返回True, 否则返回False
   """
   def getMaxNum(n):
   if n<1:
   print "参数不合法"
   return
   a=[None]*n
   #随机生成n个房问里金币的个数
   i=0
   while i<n:
   a[i]=random.uniform(1,n) #生成1~n的随机数
   i+=1
   #找出前四个房间中最多的金币个数
   max4=0
   i=0
   while i<4:
   if a[i]>max4:
   max4=a[i]
   i+=1
   i=4
   while i<n-1:
   if a[i]>max4: #能拿到最多的金币
   return True
   i+=1
   return False# 不能拿到最多的金币
   
   if __name__=="__main__":
   monitorCount=1000+0.0
   success=0
   i=0
   while i<monitorCount:
   if getMaxNum(10):
   success+=1
   i+=1
   print success/monitorCount
   程序的运行结果为:
   0.421
   运行结果分析:
   运行结果与金币个数的选择以及模拟的次数都有关系,而且由于是个随机问题,因此同样的程序每次的运行结果也会不同。
【答案解析】

[考点] 如何拿到最多金币。