The Locker Puzzle

news/2025/1/28 3:52:10/文章来源:https://www.cnblogs.com/yingxilin/p/18691914

The Locker Puzzle

今天刷到一个很有趣的著名概率题,如果有和我一样闲的人可以一起看看。
Philippe Flajolet和Robert Sedgewick在2009年提出了“百囚犯问题(The Locker Puzzle)”。

问题描述

在监狱中有100名囚犯,被编号为1-100号。典狱长决定给囚犯们一次特赦的机会,条件是通过一项挑战。在一个房间中放着一个有100个抽屉的橱柜,里面随机放着与囚犯编号对应的1-100的号码牌。挑战开始后,每个囚犯依次进入该房间,打开不超过半数的抽屉,并从中找到与自己对应的号码则为成功,每名囚犯出去时该橱柜恢复原样。从第一名囚犯进入直至最后一名囚犯出来期间不允许有任何交流,任何一名囚犯挑战失败都会导致所有囚犯死亡,只有全部成功才能够特赦该100名囚犯。如果囚犯们都随机打开50个抽屉,他们的生存几率为1/(2^100,约等于0.0000000000000000000000000000008。所以囚犯们需要找到一个最佳策略,来提高生存率。

变态的思路

1.先打开自己的号码的抽屉。
2.如果这个抽屉里有他的号码,他就成功了。
3.否则,抽屉里会有另一个号码,然后他打开这个号码的抽屉。
4.不断重复第2步和第3步,直到他找到自己的号码或已经打开了50个抽屉(那就全体失败了)。

证明

太长了,懒得抄,自己看论文吧。
https://www.cl.cam.ac.uk/~gw104/Locker_Puzzle.pdf
好吧,其实这个论文我看不懂,上抖音学下证明吧。

Last

最后是C++的小模拟(百万次测试),rt;可见,结果基本就是标准计算概率:0.3118了。

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int box[N];
int pep[N];
int vb[N],vp[N];
const int n=100;
int suc;
const int tot=1e6;
int main(){srand(time(0));for(int i=1;i<=tot;i++){memset(vb,0,sizeof vb);memset(vp,0,sizeof vp);for(int i=1;i<=n;i++){int x=rand()%n+1;while(vb[x]){x=rand()%n+1;}vb[x]=1;box[i]=x;}for(int i=1;i<=n;i++){int x=rand()%n+1;while(vp[x]){x=rand()%n+1;}vp[x]=1;pep[i]=x;}int fin=0;for(int i=1;i<=n;i++){int x=pep[i];int k=50;while(k--){if(box[x]==pep[i]){fin++;break;}x=box[x];}}printf("Test %d : The number of the successful people: %d\n",i,fin); if(fin==n) suc++;}cout<<"------------------"<<endl;cout<<"The number of ALL_PEOPLE_OUT:"<<" "<<suc<<endl<<endl;double ans=suc*1.0/tot;printf("The odds is %0.8lf",ans*100);cout<<"%"<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876003.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DDR3 memory type not supported

问题现象 电脑开机之后无法进入系统,而是显示下图: 解决方法 以为是内存条金手指有灰尘导致无法正常读取,插拔擦拭之后问题依旧。在网上查阅资料之后发现可能是内存条的电压与原装的不同,把加装的第二根内存取下之后,电脑正常。hp技术支持中心:https://h30434.www3.hp.co…

Python数据格式转换神器-提高办公效率

Python办公技巧,数据转换神器,提升工作效率一、引言在工作日常里,数据转换总是让人头疼?别急,今天揭秘一个超级实用的Python技巧,帮你轻松搞定各种数据格式转换,提升工作效率不是梦! 场景1:你手头有一堆CSV格式的(逗号分隔符)数据,其他部门或公司需要你提供其中几列关…

Python Functools模块

代码:#coding=utf-8import functools from functools import cache from functools import cached_property, lru_cache from functools import partial, partialmethod from functools import singledispatch, singledispatchmethod from functools import update_wrapper, w…

F12调试应用:强行查看洛谷个人主页

1.前言 众所周知,洛谷的个人主页常常有些不得了的东西,但是:(洛谷估值第二名%%%)这个系统维护每次都拦着我们。 有一个比较常用的方法就是删掉域名.cn,访问外国服务器(天天炸)。所以必须要有更可靠的方法。 2.F12大法妙 这时候,我们就可以按下F12打开检查。按下左上角…

【AI+安全】看不见的AI安全威胁,揭秘隐形提示注入风险

在人工智能蓬勃发展并融合到各行各业的当前,一种新型的威胁正悄然蔓延:隐形提示注入攻击。这种看不见的攻击手段,利用了用户肉眼无法识别的特殊字符,悄无声息地影响着大语言模型的行为。它就像一个隐藏在阴影中的刺客,偷偷操纵强大的 AI 系统做出意想不到的危险行为。 如果…

unity shader 消融效果

消融效果 基础消融效果原理多方向和可控消融

React中的数据流管理

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:霜序前言💡 为什么数据流管理重要? React 的核心思想为:UI=render(data) ,data 就是所谓的数据,render 是 React 提供的纯函…

代码随想录算法训练营第9天 | 151.翻转字符串里的单词、右旋字符串、28. 实现 strStr()、重复的子字符串、字符串:总结篇、双指针回顾

一、刷题部分 1.1 151.翻转字符串里的单词原文链接:代码随想录 题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)1.1.1 题目描述 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。…

《CPython Internals》阅读笔记:p360-p377

《CPython Internals》学习第 20 天,p360-p377 总结,总计 18 页。 一、技术总结 1.seaborn 可视化工具。 2.dtrace (1)安装 sudo apt-get install systemtap-sdt-dev(2)编译 ./configure --with-dtrace make clean make3.snakeviz 适用于 cProfile 的可视化工具。 二、英语总…

goland2024如何安装?附安装包和激活方式

前言 大家好,我是小徐啊。goland是我们开发Go语言时的常用的开发工具,功能强大,今天,小徐就来介绍下如何安装和获取激活方式。文末附获取方式。 如何安装和激活goland 首先,我们双击下goland2024安装包,开始安装。然后,我们点击下运行按钮。然后,我们点击下一步按钮。然…

AI实现个人阅读网页插件

背景 日常工作中经常需要浏览各种Github项目或者一些网页,逐字逐句看总觉得不够效率,如果在每次打开一个新的页面时就能够掌握大概的内容,然后再决定是否深入阅读就方便多了。有了这样的念头后,总想自己开发一款简单的浏览器插件,但是始终没有提上日程。目前随着AI编程工具…

RabbitMQ之Exchange、Queue参数详解

1.先来介绍RabbitMQ中的成员Producer(生产者): 将消息发送到Exchange Exchange(交换器):将从生产者接收到的消息路由到Queue Queue(队列):存放供消费者消费的消息 BindingKey(绑定键):建立Exchange与Queue之间的关系(个人看作是一种规则,也就是Exchange将什么样的消息路由…