用程序解决儿子的问题(二):你要几个宝石?

之前写了:用程序解决儿子的问题:她们分别买了什么?,这是第二篇

问题

一个国王要奖给大臣宝石,他对大臣说:袋子里有红宝石和绿宝石,红宝石有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个宝石最有利。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容