zoukankan      html  css  js  c++  java
  • 【经典概率题】百囚徒挑战

    起因,这两天多校概率题挺多的,又不太会做。

    刚好学长发了一些概率问题知识就有这个就去了解了一下

    有一个很反直觉的问题,叫作百囚徒挑战。

    很多时候,我们都会靠直觉去评价一件事情,但很多时候,我们的直觉是错的,哪怕感觉有多么准确,而最著名的反直觉问题,就是百囚徒挑战。

    img

    问题描述 监狱决定给关押的100名囚徒一次特赦的机会,条件是囚徒通过一项挑战。

    1、所有囚徒被一一编号,编号为1-100。
    2、将编号1-100的100个号码牌,随机放在100个抽屉。
    3、每个囚徒可以打开最多50个抽屉,如果找到对应自己编号的号码牌,则该囚徒挑战成功,反之挑战失败。
    4、所有囚徒全部挑战成功,该项挑战才算成功,任意一名囚徒挑战失败,则该项挑战失败!

    囚徒们有一个月的时间去讨论策略,那么,这100个囚徒有多大的概率能够得到释放?

    前三点看起来并不难,但第四条直接将难度直线升级。从直觉来看,每个囚徒完成挑战的概率就是1/2,而且每个囚徒的挑战都是独立事件,所以100个囚徒同时成功的概率就是(1/2)的100次方,这个数,几乎接近于零!

    那么为什么说这个问题是反直觉的?

    实际上,这个题目并不是单纯的概率题。比如考虑最简单的情况,囚徒只有两人,那么他们每人只能从两个抽屉里选择一个抽屉打开,这时他们被释放的概率是1/4吗?不是。如果两个囚徒打开不同的抽屉,那么他们被释放的概率是 1/2,反之如果两个囚徒打开同一个抽屉,那么他们被释放的概率是0.

    因此,只要囚徒采取了正确的策略,那他们获胜的概率很大,在人数为100人时,仍旧有 (30\%) 那么多。同时,当人数趋于无穷,这个概率不会变得更小,而是趋近于 (1 - ln 2) !!

    下面开始解释为什么概率是趋近于 (1 - ln 2)


    解答的细节来自知乎的大佬 Yuz.Scarlet

    不妨假设抽屉里的号码牌是随机放置的(否则,囚徒可以自己在脑内打乱所有抽屉的位置以达到同样的效果※),之后囚徒首先为抽屉编号,例如从左上到右下依次编号。而每个囚徒的策略,就是首先打开与自己编号相同的抽屉,从中取出号码牌,并打开号码牌所对应的抽屉。之后,重复此过程,直到找到自己的号码牌,或者50个抽屉的机会用完。

    例如,29号囚徒首先打开了29号抽屉,里面放着51号的号码牌,于是他打开51号抽屉,里面放着18号的号码牌,于是他打开18号的抽屉,里面放着29号的号码牌,他完成了任务。(只是随便举例)(※※)

    为了计算成功概率,首先对这个游戏进行化简。将抽屉与号码牌的对应关系视为一个映射,例如 (f(29) = 18,f(51) = 18) ,那么从任意一个数出发,不停地迭代计算,最终总能回到这个数。通过这种方法,(1) ~ (100) 的数字被分割为了一些“圆环”,而每个圆环的长度不一,比如 (3 o 3) 的长度就是1,意味着3号抽屉里装着3号号码牌, (29 o 51 o 18 o 29) 的长度是3;这时,我们发现,所有囚徒能够通过挑战,当且仅当所有圆环的长度不超过50,此时显然每个囚徒都能在50次以内找到自己的号码牌,反之如果有一个圆环长度超过50,那么这个圆环上的所有人都会失败。

    接下来就是计算了。比起计算“所有圆环的长度不超过50”的概率,“有一个圆环长度超过50”的概率更容易计算。因为“有一个圆环的长度是51”和“有一个圆环的长度是52”之类的事件是彼此互斥的(圆环的长度总和是100),所以总概率就是它们的和。而对于 (m ge 51) ,只需先选出 (m) 个元素,将它们构成一个环,之后再将剩下的元素随机打乱即可唯一地得到一种分布。

    具体地说,所有形成长度为 (m) 环的映射种类为 (C_{100}^m * (m-1)!*(100 - m)! = 100!/m) ,全排列个数为 (100!) ,因此这个概率等于 (P(m) = 1 / m)

    综上,所有圆环长度不超过50的概率等于 (P = 1 - sumlimits_{m = 51}^{100}frac 1m ≈ 0.312) ,这个概率就是囚徒被释放的概率。当囚徒人数趋于无穷大时,概率趋向于 $ P = 1 - sumlimits_{m = N + 1}^{2N}frac 1m ≈ 1-ln 2$

    Seg-Static

    不那么严密地说,这个策略的关键点在于让所有囚徒尽可能地一起成功或者一起失败,因此所有玩家的任务不再是独立的,一旦有一个人成功,他所翻出的号码牌对应的人也一定会成功,同时只要有一半的人成功,剩下的人都一定成功。

    通过计算可得,在之前所有人都成功的条件下,下一个人成功的概率依次为

    [50\%,75.25\%,89.26\%,95.63\%,...... ]

    这个策略被证明最优。

    Seg-Static

    ※否则,囚徒可以自己在脑内打乱所有抽屉的位置以达到同样的效果
    因为在挑战开始之前有一个月时间商讨对策,所以囚徒可以在这段时间内约定好随机打乱抽屉的方式。另外,如果担心囚徒的策略被狱警知晓,也可以考虑迪菲赫尔曼密钥交换(前提是P≠NP),这是一种大声说悄悄话的方法,具体做法是利用非对称算法,使得两个没有任何共同知识的人知晓一个共同的关键词,并且任何窃听者无法通过两人的对话推理出这个关键词,之后这个关键词可以作为加密的秘钥使用。

    ※※另外直观地解释一下这个策略的含义,这里以10个人的情况举两个例子。

    假如说10个抽屉与号码牌的对应关系如下:
    1号抽屉→5号牌
    2号抽屉→7号牌
    3号抽屉→3号牌
    4号抽屉→2号牌
    5号抽屉→9号牌
    6号抽屉→10号牌
    7号抽屉→4号牌
    8号抽屉→8号牌
    9号抽屉→1号牌
    10号抽屉→6号牌

    1号囚徒首先打开自己的编号对应的抽屉即1号抽屉,取出5号号码牌,接着打开5号抽屉,取出9号号码牌,接着打开9号抽屉,取出1号号码牌,完成任务;
    2号囚徒首先打开自己的编号对应的抽屉即2号抽屉,取出7号号码牌,接着打开7号抽屉,取出4号号码牌,接着打开4号抽屉,取出2号号码牌,完成任务;
    ……
    10号囚徒首先打开自己的编号对应的抽屉即10号抽屉,取出6号号码牌,接着打开6号抽屉,取出10号号码牌,完成任务;

    就这样,在这种对应关系下,所有囚徒都完成了任务;

    假如说10个抽屉与号码牌的对应关系如下:
    1号抽屉→2号牌
    2号抽屉→8号牌
    3号抽屉→5号牌
    4号抽屉→6号牌
    5号抽屉→1号牌
    6号抽屉→4号牌
    7号抽屉→10号牌
    8号抽屉→9号牌
    9号抽屉→3号牌
    10号抽屉→7号牌

    1号囚徒打开1号抽屉,取出2号号码牌;打开2号抽屉,取出8号号码牌;打开8号抽屉,取出9号号码牌;打开9号抽屉,取出3号号码牌;打开3号抽屉,取出5号号码牌;任务失败
    4号囚徒打开4号抽屉,取出6号号码牌;打开6号抽屉,取出4号号码牌;任务成功

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    glog下载、安装、使用
    VS所需插件
    Qt 实现动态调整流程指令顺序(通过鼠标事件实现)
    QComboBox实现复选框功能
    QString string char* int互相转化
    Qt 滚动区域显示下拉框
    模式对话框,非模式对话框,reject和accept()槽函数确定对话框的返回值
    QT递归搜索文件(entryList)
    QT中foreach的使用
    Qstring格式化字符串
  • 原文地址:https://www.cnblogs.com/RioTian/p/15087052.html
Copyright © 2011-2022 走看看