在一个盒子里找到你自己的号码

时间:2008-08-29 10:39:14

标签: algorithm puzzle

100(或某些偶数2N :-))囚犯在A房间。他们从1到100编号。

一个接一个地(从囚犯#1到囚犯#100,按顺序),他们将被送进B室,其中100个箱子(编号从1到100)等待他们。在(关闭)框内是从1到100的数字(框内的数字是随机置换的!)。

一旦进入B室,每个囚犯都会打开50个盒子(他选择打开哪一个)。如果他找到这50个箱子中的一个分配给他的号码,那么囚犯就会走进C室,所有箱子再次关闭,然后下一个人从A室走进B室。否则,所有囚犯(在房间A,B和C)被杀死。

在进入B室之前,囚犯可以就策略(算法)达成一致。房间之间没有办法通信(B房间也没有留言!)。

是否存在最大化所有囚犯生存概率的算法?该算法实现了什么概率?

注意:

  • 随机做事(你称之为'无策略')确实为每个囚犯提供了1/2的概率,但随后所有囚犯幸存的概率为1/2 ^ 100(相当低) )。一个人可以做得更好!

  • 囚犯不得重新订购这些盒子!

  • 所有囚犯在囚犯第一次找不到他的号码时被杀。 无法沟通。

  • 提示:平均可以拯救超过30名的囚犯,这远远超过(50/100)*(50/99)* [ ......] * 1

10 个答案:

答案 0 :(得分:7)

这个谜题在http://www.math.princeton.edu/~wwong/blog/blog200608191813.shtml解释,并且该人在解释问题方面做得更好。

“所有囚犯被杀”的说法是错误的。 “你可以平均节省30+”也是错误的,article说30%的时间可以节省100%的囚犯。

答案 1 :(得分:3)

我发现解决这类问题的低技术解决方案始终是最好的方法。

首先我们对情况做出一些假设

  • 囚犯不是所有程序员或数学家
  • 他们不想死?
  • 守卫装备精良

因此,他们明天将有0.005%的可能性,这个问题有一个非常简单和低技术的解决方案。 RIOT

一切都是关于损失和潜在的收益,囚犯远远超过卫兵的数量,并且彼此使用作为人体盾牌,因为无论如何他们都是死人,如果他们不这样做,他们可以增加他们的机会过度使用后卫,一旦他们拥有了他的武器就有机会上升,帮助他们为更多的守卫提供更多的火力来进一步提高生存率。一旦守卫意识到正在发生的事情,他们可能会跑到山上并锁定监狱,这将使媒体抬头,然后是人权问题。

答案 2 :(得分:1)

实施排序算法并根据其中的数字对框进行排序。

第一个囚犯对50个箱子进行了分类,第二个囚犯对另外50个箱子进行了分类并与第一个囚犯合并。 (请注意,第二个囚犯可以猜出前50个方框内的值)

在第二个囚犯之后,所有的盒子都将按照分类顺序排列!!!

其他人可以轻松打开包含其号码的方框。

答案 3 :(得分:1)

我不知道这是否允许,但我能找到的最佳近似值是:

编辑:好的,我认为这样做了。当然我将此视为一个计算问题,我认为任何prisioner都不会执行此操作,但如果你不这样做的话,那就非常直接了。

找到前50个素数,让我们将它们保存在一个名为primes的数组中。

  • 第一个审判员进入B室并打开第一个方框,找到数字m。
  • 等待素数[1] ^ m(即3 ^ m)
  • 打开方框2并阅读数字 - > Ñ
  • 等待(primes [2] ^ n - 1)* primes [1] ^ m,即(5 ^ n - 1)* 3 ^ m,他等待的总时间为3 ^ n * 5 ^ N

重复。在第一个prisioner之后,他的总时间将是: 3 ^ m * 5 ^ n * 7 ^ p ... = X

在第二个prisioner进入房间之前X分解X.你事先知道使用的素数,因此分解是微不足道的。这样你就可以获得m,n,p等,所以第二个prisioner知道前一个prisioner使用的每个盒子/数字组合。

第一个杀死所有人的概率是1/2,第二个将有50 /(100-n)(n是第一个尝试的数量)第三个将有50 /( 100 - n - m)(如果n + m = 100则所有位置都已知),依此类推。

显然,下一个审讯人员必须跳过已知的方框(如果包含其编号的方框已知,则最后一个选项除外)

我不知道确切的可能性是什么,因为它取决于他们必须做多少选择,但我会说它非常高。

编辑:重读,如果审判者在获得他的号码时不必停止,那么整个团队的概率就会大大提高,恰好是50%。

EDIT2:@OysterD这样看。如果第一个prisioner可以打开50个盒子,那么第二个可以知道它的编号是否在任何一个盒子中。如果是,那么他可以打开其他49(并通过这样做来学习100个盒子的盒子/数字组合)并最终打开他的那个。因此,如果第一个prissioner成功,那么每个人都会成功。请记住,每个prisioner为对方提供了一种方法,可以准确地知道他打开的每个框的框/数字组合。

答案 4 :(得分:0)

也许我没有正确地阅读它,但问题似乎是构造错误或缺少信息。

  

如果他找到了那个号码   在这50个中的一个中分配给他   盒子里,囚犯可以走进去   房间C和所有箱子都关闭   在下一个走进之前再次   房间B从A房间开始。否则,全部   囚犯(在房间A,B和C)得到   杀死。

最后一句是否意味着所有囚犯在囚犯第一次找不到他们的号码时被杀?如果不是,那些没有找到号码的囚犯会怎么样?

如果没有可能的沟通,并且每当囚犯进入B室时,它总是处于相同的状态,那么就不可能制定策略。

囚犯可以在他们离开房间A之前说出他们要打开的号码箱。但是,如果没有后来的囚犯知道他们是否成功(假设一个人没有失败),当下一个囚犯进入B室时,他们仍有与前一个囚犯相同的几率(总是1:100)

如果一个人的失败是所有人的失败,那么通过知道以前的囚犯打开了哪个方框,并且由于他们并未全部被杀,每个连续的囚犯都可以减少选择错误方框的几率。一个盒子。即第一名囚犯为1:100,第二名为1:99,最后一名为1:1。

答案 5 :(得分:0)

囚犯可以同意囚犯1打开1-50盒子。

如果他们还活着,他们同意下一个囚犯打开2-51号盒子。 (2是任意的,但很容易记住这个规则)他的存活率,因为P1存活现在是50/99。当你知道前一个人找到他的时候,你想要消除开箱。

我不知道这是否是最佳的,但它比随机要好得多。

幸存的概率看起来像

50/100 * 50/99 * 50/98 *。 。 .50 / 51 * 1

答案 6 :(得分:0)

我认为,由于无法进行沟通,最佳策略将涉及

  

尽可能均匀地分配每个囚犯的概率

我是否走在正确的道路上?

每位囚犯可获得的信息:

  
      
  • 幸存囚犯的数量,所以如果你有一个有效的盒子拣选系统利用任何囚犯进入B室的命令,那么一个策略肯定是可能的
  •   
  • 早先的囚犯挑了哪些盒子。当然,在运行期间无法进行通信,并且无法记住任何100个盒子的拾取排列。 但您可以在运行开始之前使用此信息在系统中进行计算。
  •   

我的观点:

  
      
  1. 绘制一个包含2列的数字表,第一列包含方框编号(从方框#1到方框#100)。然后每个囚犯选择50个盒子和他们挑选的任何盒子,他们应该在第二列的相应行上放置1个标记。
  2.   
  3. 然而,所有囚犯都要求不要两次挑选任何一个盒子。并且没有任何方框可能被标记为超过50个。有些囚犯的选择可能比其他囚犯少,因为某些方框可能首先被填满50分。
  4.   
  5. 当一名囚犯被转移到B室时,他/她会打开他标记的任何方框。
  6.   

答案 7 :(得分:0)

相同的概念。

Aonther take:

  
      
  1. 记下前100个二进制数的列表,其中有50个1和50个。
  2.   
  3. 将它们从最低到最高排序。
  4.   
  5. 囚犯#1获得第一个号码,囚犯#2获得第二个,囚犯#3获得第三个等等......
  6.   
  7. 每个囚犯都记得他/她的二进制数字。
  8.   
  9. 当任何囚犯被转移到B室时,他/她然后将他记住的数字的二进制数字与每个盒子匹配,最高位与最左边的盒子匹配,下一个最高位与第二个盒子匹配最左边的框...最低位与最右边的框匹配。
  10.   
  11. 他/她打开与1匹配的任何框,并留下与0匹配的关闭框。
  12.   

这样可以最大限度地降低这种可能性,因为早期的囚犯会获得与后来的囚犯不同的数字,而且数量接近的囚犯会得到数字靠近的数字。这并不能保证生存能力,但如果早期的囚犯确实存活下来,那么后来的囚犯也有可能存活下来。

我没有想出确切的数字和理由,但这是我现在能想到的一个快速解决方案。

答案 8 :(得分:0)

如果所有囚犯在某人未能找到他们的号码时被杀,那么你可以省100或者0.没有办法拯救30人。

答案 9 :(得分:0)

问题没有任何时间限制,所以我建议囚犯决定每箱1小时,然后按顺序打开。如果第二个囚犯在2小时后被允许进入房间,那么他知道第一个囚犯在方框2中找到了他自己的号码。因此他知道在他的序列中跳过方框2并打开方框1,3,4 ... 51 第一个囚犯失败的几率为50/100 给第一个囚犯幸存下来然后第二个囚犯获胜的机会是50/99 所以答案似乎是((50 ^ 51)* 49!)/ 100! 根据谷歌制作2.89 * 10 ^ -9 这几乎是零 因此,即使囚犯知道这些箱子,以前幸运的人发现他们的号码也没有希望