选张卡片!

这个谜题是一种纸牌游戏,其目标是找到最大的牌。

从编号为1到100的100张牌组成的洗牌组中,你将获得面朝下的10张牌。你把牌一张一张地翻过来。每张牌之后,你必须决定是否结束游戏。如果你以手中最高的一张牌结束比赛,你就赢了;否则,你就输了。

优化您获胜机会的策略是什么?当牌组和手的尺寸改变时,策略是如何改变的?

这是我的解决方案:
[显示解决方案]

关于“选张卡片!”的17个想法

  1. 劳伦特,你好,
    这与我发现的策略不同。我不明白你是如何达到这样一个标准的:获胜概率为1/2或更高意味着你应该停止比赛,而小于1/2意味着你应继续比赛。
    我发现如果我不停下来,人们应该计算获胜的概率,我将其写为
    P(n,k,m,a)
    (在抽到k张牌的n牌游戏中,当第m张牌被翻转并且到目前为止的最大值是a时,剩余的k-m张牌的最佳策略将导致获胜的概率)。
    然后我必须把你计算正确的,如果我停下来的话,获胜的机会与P(n,k,m,a)进行比较。在某些情况下,P(..)在1/2以下就足够了,即使赢的机会略低于1/2,你也应该停下来。我的(效率极低)代码位于
    https://theorie.ikp.physik.tu-darmstadt.de/qcd/ncards.c
    看看它是否给出了与您的方法稍有不同的获胜概率。
    盖·摩尔

    1. 我真的很喜欢阅读你的解决方案。像往常一样,我离开时会考虑一些我没有考虑过的事情。

      我同意盖·摩尔的观点。考虑n=50和k=4的情况。如果第一张牌是40,并且您结束游戏,则获胜概率为Comb(39,3)/Comb(49,3)=0.4960。由于这个值小于0.5,按照你的逻辑,你应该继续游戏。

      但如果你继续比赛,你获胜的概率实际上会降低。如果你的第一张牌是40,那么赢的方式总数是sum(Perm(i-2,2),i,41,50)+39*sum(Perm(i-3,1),i、41,50,)+39*18*10=49965。获胜概率为49965/P(49,3)=0.4520。

      经验上,0.5标准是解决方案的一个很好的近似值,我通过模拟得出了类似的阈值。我认为你需要比较如果你停止游戏的获胜概率和如果你继续游戏的获胜几率,以获得准确的解决方案。

      1. 谢谢盖伊和马修的评论。你们都对了。我说得对,如果P>1/2,你应该停下来,但我草率地得出结论,如果P<1/2,你就应该继续比赛。我会对此进行更多思考,并希望很快修改我的解决方案。

        1. 我更新了我的博客帖子。我现在大致准确地计算出了解,并将两者进行了比较。事实证明,1/2的启发式非常好!感谢所有反馈!

          编辑:谢谢Gabe!我做了你建议的修改,并对文本进行了编辑以澄清。

          1. 正如您(正确地)在之前的评论中所指出的,如果p>1/2,您应该始终停止,有时即使p<1/2也应该停止。然而,解决方案的第三段内容如下:

            “(1/2启发式)结果是一个次优策略,因为我们获胜的机会可能是甚至更大如果我们继续比赛!"

            这似乎意味着相反的主张:如果p<1/2,你应该一直继续,有时甚至p>1/2。如果你把它改为“……我们失去……的机会”或“……可能甚至更少……”(当然不是两者都有),这是正确的。

        2. 我找到了一个很容易计算的公式来计算如果你继续下去的话获胜概率:

          P(a,m,k,n)=和[prod[j,{j,a-i+2,a-m}]*和[Perm(j-i,k-i),{j、a+1,n}],{i,m+1,k}]/Perm(n-m,k-m)

          这是我是如何得出这个公式的。如果你在第七张牌后继续打牌,你可以通过k-m方式获胜:

          1.)m+1卡在a+1和n之间,你停下来,所有其他卡都更低。有可能发生这种情况的Perm(a+1-m-1,k-m-1)+…+Perm(n-m-1,k-m-1)。
          2.)第m+1张牌小于a,第m+2张牌介于a+1和n之间,你停下来,所有其他牌都更低。有(a-m)*(Perm(a+1-m-2,k-m-2)+…+Perm(n-m-2,k-m-2))可能发生这种情况。
          3.)第m+1和m+2张牌小于a,第m+3张牌介于a+1和n之间,你停下,所有其他牌都更低。有(a-m)*(a-m-1)*(Perm(a+1-m-3,k-m-3)+…+Perm(n-m-3,k-m-2))可能发生这种情况。
          4.)等。

          该公式将所有这些事件相加,然后除以手排列的数量,以计算获胜概率。当停止获胜的概率小于继续获胜的概率时,就会出现阈值。使用这个公式和你关于如果你停下来获胜概率的公式,我得出了与你在修改后的帖子中所做的完全相同的阈值(这太棒了!)。

          1. 我不太明白——你如何解释停下来和不停下来的区别?似乎在1.)中,你数一数下一张翻过的牌是赢家的方式。但是,如果你也决定在这一点上停下来,你不应该只计算这些案例吗?决策规则不应该在这里发挥作用吗?

            例如,如果第(m+1)张牌大于a,我可能会赢,但无论如何我都会继续玩,然后第(m+2)张牌更大,我停下来,所有后续的牌都更小。获胜的概率应该取决于我用来决定何时停止的规则,不是吗?

          2. 你说得很好:“例如,如果(m+1)第一张牌大于a,我可能会赢,但我还是继续玩,然后(m+2)第二张牌更大,我停下来,所有后续的牌都更小。”

            考虑n=100和k=10以及m=1的情况。假设我已经使用了我将要提出的论点,排除100到94作为最佳阈值,我想测试93。直观地说,随着牌数的增加,停止阈值将降低。因此,如果第一张牌是93,我继续玩,则所有后续阈值必须≤94。因此,如果我在第二张牌上得到更高的牌(94到100),我必须停止玩,因为第二张卡将等于或超过第二个阈值。我没有选择继续打牌并在稍后获得更高的牌。接下来的八张牌都必须低于第二张才能赢。类似地,如果第二张牌较低(1到92),第三张牌较高(94到100),则第三张卡将超过第三个阈值,我将不得不停下来,并希望接下来的七张牌更低。等等…

          3. 仅仅因为我一直在比赛,这并不意味着我当前的数字正好处于阈值……例如,假设你已经确定m=1,2,3,4,5的阈值为:
            90、80、70、60、50、0(当然,这些不是真正的阈值)。
            现在假设翻转的卡片是:
            5, 25, 20, 32, 62, 55
            然后,门槛规则会让我继续比赛,直到我达到62岁,在这一点上我会停下来,因为62>50。在这个例子中,我赢得了比赛。根据你之前的帖子,这个案例并不是一种可能的获胜方式。翻开第一张卡片后,我得了5分。第二张牌的价值更大,但我没有停下来。事实上,“a”改为25,然后改为32,再改为62,这时我终于停了下来。

          4. 是的,我认为我没有很好地解释自己……或者我的逻辑肯定有缺陷🙂

            出于好奇,你能检查一下对于某些任意情况,我们是否达到了完全相同的阈值吗?例如,当n=937和k=23时,我得到以下阈值:905、903、902、900、898、895、893、890、887、883、879、874、868、860、852、840、826、806、777、732、654、480

            感谢所有的回复,值得一提的是,这里有一个到我的Matlab代码的链接。

            https://www.dropbox.com/s/u6b7adc614p99yt/liger.m?dl=0

          5. 我得到了与你在n=937,k=23的情况下得到的阈值规则完全相同的阈值规则。我一定错过了什么,因为你似乎没有统计所有可能的病例……我们可以再试一次吗?对于n=25,k=13,我得到:24,24,24。

          6. 我得到了与你完全相同的阈值。让我再试一次:

            对于n=100和k=10,假设第一个阈值为93。这意味着在93岁时停下来获胜的概率大于在93岁比赛获胜的概率。数学上来说:P_stop(n=100,k=10,m=1,a=93)>P_play(100,10,1,93)。为了紧凑,我将其写为P_stop(93)>P_play(93)。这也意味着P_play(92)>P_stop(92)。换言之,92岁比赛比停下来要好。

            我们同意P_stop(92)=C(92-1,10-1)/C(100-1,10-1)=0.4528。但是P_play(92)呢?由于我们正好低于第一个阈值,并且我们知道所有后续阈值都将≤93,因此任何未来的牌>92都将迫使我们停止游戏。获胜的唯一方法是得到正好一张大于92的牌,停下来,希望所有其他牌都更低。使用我之前发布的公式,P_play(92)=0.4659。实际上,P_play(92)>P_stop(92)。

            我们还必须检查P_stop(93)>P_play(93)。果然,P_stop(93)=0.5019,P_play(93)=0.4346。由于最佳策略的转换发生在92到93之间,因此93必须是阈值。

            简而言之,这是我的方法。我的代码将搜索满足P_stop(a)>P_play(a)和P_play。

  2. 做得很好。我也做了类似的事(https://hecorpefo.github.io/2017-04-22-highest-card/)这将产生与您的解决方案相同的计算获胜概率和阈值。然而,令人沮丧的是,我的蒙特卡洛模拟使用这些阈值得出的获胜概率较低,约为0.595。那么,在某处……可能在模拟人生中发生了什么?但这很简单。

    https://github.com/hectorpefo/hectorpefo.github.io/blob/master/_includes/PickACard538.py

  3. 很抱歉在你的评论区发垃圾邮件,但我找到了n接近无穷大时阈值的精确分析表达式。对于无限数量的卡,让卡值的范围从[0,1]开始。定义q=k-m,并将x作为阈值,作为q的函数。阈值是以下问题的解决方案:

    z(q)/q!*x^q–总和[x^(q-i)/i,{i,1,q}]=0,其中z(1)=2,z(i)=i*z(i-1)+(i-1!

    第一对阈值为:0.50000、0.68990、0.77585、0.82459、0.85595…
    当n>10000时,这些阈值与阈值很好地对齐(精度为3-4位数)。

  4. 劳伦特和赫克托,
    近似答案和“最佳”答案之间的差异很小。你有没有通过模拟测试过它们(以及一些介于两者之间的可能性)。我可以试试,但我并没有准备好这么容易。

  5. 你好,劳伦特!!
    希望一切都好。我真的很喜欢阅读你的解决方案。递归是我最喜欢的主题之一,我在阅读那个博客时发现它非常有趣。
    谢谢。

留下回复

您的电子邮件地址将不会被发布。 已标记必填字段*