之前写了:用程序解决儿子的问题:她们分别买了什么?,这是第二篇
问题
一个国王要奖给大臣宝石,他对大臣说:袋子里有红宝石和绿宝石,红宝石有5个,绿宝石6个,你可以取任意数量的宝石,如果红宝石的数量和绿宝石的数量相同,这些宝石就归你,如果不相同,你就得不到宝石,你要取几个宝石呢?
分析
如果红宝石和绿宝石数量相同,那必须取偶数个,也就是2、4、6、8、10,很容易分析,取2个和10个赢的的概率是6/11,那取4个、6个、8个赢的概率是多少呢?用概率分析就有点难了,不如直接写程序计算。
程序
import random
from functools import reduce
def solve(count, num):
win = 0
for i in range(count):
box = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
picked = []
for j in range(num):
r = random.randint(0, len(box) - 1)
ball = box[r]
box.remove(ball)
picked.append(ball)
summary = reduce(lambda x, y: x+y, picked)
if summary == num // 2:
win += 1
return win
def main():
nums = [2, 4, 6, 8, 10]
total = 1100000
for num in nums:
win = solve(total, num)
print('试验{}次取{}个宝石,赢了{}次,赢的概率*宝石数量: {}'.format(total, num, win, win/total * num))
if __name__ == '__main__':
main()
某次输出结果
试验1100000次取2个宝石,赢了599902次,赢的概率*宝石数量: 1.0907309090909092
试验1100000次取4个宝石,赢了500568次,赢的概率*宝石数量: 1.8202472727272727
试验1100000次取6个宝石,赢了475705次,赢的概率*宝石数量: 2.5947545454545455
试验1100000次取8个宝石,赢了499749次,赢的概率*宝石数量: 3.634538181818182
试验1100000次取10个宝石,赢了599903次,赢的概率*宝石数量: 5.453663636363636
因为结果又一定的随机性,我们推断取2个和10个赢的概率,取4个和取8个赢的概率是一样的。结合概率和数量,取10个宝石最有利。