题目描述:10个房间里放着数量随机的金币,每个房间只能进入一次,并且只能在一个房间中拿金币。一个人采取如下策略:前4个房间只看不拿,随后的房间只要看到比前4个房间都多的金币就拿,否者就拿最后一个房间的金币。编程计算这种策略拿到最多的金币的概率。
分析与解答:这道题要求一个概率的问题,由于10个房间放的金币的数量是随机的,因此,在编程实现的过程中首先需要生成10个随机数来模拟10个房间里金币的数量。然后判断通过这种策略是否就能拿到最多的金币。如果仅仅通过一次模拟是不准确的,那么就需要进行多次模拟,通过记录模拟的次数m,拿到最多的金币次数n,从而计算拿到最多金币的概率n/m,这里我们以金币数量1~10, 模拟次数1000次为例来实现代码。
import random
def getMaxNum(n):
if n < 1:
print("参数不合法")
return
a = [None]*n
# 随机生成n个房间里金币的个数
i = 0
while i < n:
a[i] = random.uniform(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
succes = 0
i = 0
while i < monitorCount:
if getMaxNum(10):
succes += 1
i += 1
print(succes/monitorCount)