单人蜘蛛接龙(以下简称为“蜘蛛**”)是人们经常在电脑上**或者离线玩的一款很受欢迎的游戏。这个游戏是只有一个玩家的。游戏中一共有两套标准***,各四种花色),从而进一步把它们从台面上消除。牌可以从牌组中提取或者按照特定规则从一列移动到另一列。我们这里不再详细地讨论游戏规则,假设我们的读者已经了解游戏的规则了。要是你需要回忆一下,可以看这里。在这里我们只讨论这个游戏的四组的版本。
玩家们一直在抱怨说不同的软件存在偏差。具体来讲,就是如果程序探测到了玩家的胜率很高,它可能就暗中操纵后面的牌的次序来降低胜率。玩家本身也有可能被偏向从而发挥出**水平。不过,通过一些基本的统计学手段,我们有可能对这种“偏向的指控”进行证实或者驳斥。这一点也可以作为一个很好的练习,
从本文的角度出发,我们这里假设玩家在玩蜘蛛**的时候不使用“撤销”“重来”“加步”(把游戏削减为一个简陋的初始版本),这样玩家就不用考虑计分、花费的时间以及移动的步数了。很多人都认为在这样的条件下游戏几乎赢不了,但是加州州立大学长滩分校的史蒂夫・布朗在他出色的著作《蜘蛛**获胜策略》中给出了一些详细的策略,并且提到在 306 *游戏中可以取得 48.7% 的胜率。那些专业玩家可以做得更好,甚至达到超过 60% 的胜率。我利用了布朗的这些策略进行了实验,结果表明确实能够达到超过 48.7% 的胜率。
理想情况下,电脑端蜘蛛**游戏能够模拟真实情况下且**充分的**游戏。如果在游戏的任何一个节点,有 N 张牌还没被看过,那么每张牌都有 1 / N 的可能*作为下一张翻面的牌出现(为了叙述的方便,我们忽略了具有相**色和大小的**之间的等价*)。举个例子,在起始位置我们知道有 10 张牌被亮了出来。因为总共的 104 张牌里一共有 8 张 K,所以单张亮出来的牌是 K 的概率是 8/104=1/13,因此亮出来的牌是 K 的期望张数是 10×1/13=10/13。如果在玩了相当多*数的游戏之后,我们发现亮出来 K 的数目平均下来接近 11/13,我们就有理由相信这款蜘蛛牌程序是有偏向*的。
数值越高,证明获胜的几率越大。我们想到的一个方案是评估在一***公平、无偏袒*的游戏里,
一旦最初的十张牌都确定下来,我们就能计算出“保证轮数(guaranteed turns,GT)”,即玩家在被迫更换至另一排之前能够确定亮出的牌的最少数目。无论何时,当新的一排的十张牌已经确定下来后,我们都可以做一个类似的计算,假装它是新的一*游戏的开始。这样一来我们就可以计算出GT 的平均值(AGT)。如果几轮下来 GT 的值很小,那么玩家就要有麻烦了。要说明的是 AGT 和玩家本身无关,所以很容易通过进行很多次实验(即确定很多排)来模拟出 AGT 的概率分布。
经验来谈,如果卡牌的整体分布比较糟糕的时候,玩家同样会陷入麻烦。比如说有七张 Q 但是只有两张 J 没有打出来的时候,即使你有一列或者多列已经清空,仍然会有问题出现。因此在这里定义一个整体方差(total square variation,TSV),取值为相邻大小的牌的数目的负的平方之和。在刚才的例子里,七张 Q 和两张 J 在求和时会贡献出 -(7-2)2=-25 一项。这里取负值是为了确保 TSV 的增减*与获胜概率的增减*一致,就和 AGT 一样。每亮出一张新牌我们就计算一下 TSV,这样我们可以算出来单*游戏的平均 TSV(ATSV)。要提起注意的是 ATSV 同样与玩家无关,我们假定玩游戏的玩家会按照一个随机顺序把所有扣着的牌都亮出来(尽管玩家可以选择先亮哪张牌,但是亮出的每张牌概率是一样的)。幸运的是这一点可以通过模拟很容易就做到。
一个典型的散点图如上图,这里蓝色圆圈和红色叉叉依次表示获胜和落败。
模拟结果显示对于没有偏袒的游戏程序而言,在大量*数的游戏之后,AGT 应该等于 3.96 而 ATSV 应该等于-32.29。在下面这个示例的起始位置中,GT=1,TSV=-42,因为这*游戏还没结束,我们还不知道 AGT 和 ATSV 的值是多少。

假设检验
为了检验一个蜘蛛**游戏是不是有偏向*,我们采用一种叫假设检验的手段。我们先制定一个零假设(意思就是我们怀疑的效应可能不存在),在我们这里是指“蜘蛛**程序并不存在偏向*”,那互补的假设就是“蜘蛛**程序故意使绊子使得玩家的胜率下降”。
首先选取一个较大的数 N 作为待检测的蜘蛛**游戏的*数,然后每一*我们计算一次 AGT 和 ATSV。接下来的总体思路是求出我们要比对的观察结果的概率(即 P 值),或者更*端一点说,零假设为真(即程序没有偏向*)的概率。如果概率低于某一个阈值(即***水平),一个没有偏向*的程序就不太可能产生我们在 N *游戏中观察到的这种 AGT 和 ATSV 值,那我们就拒绝零假设并且得到“游戏有偏向*”的结论。
那我们如何计算得到 p 值,即观察到我们已经观察到的 AGT 和 ATSV 值(这证明游戏没有偏向*)的概率呢?在模拟中我们已经得到了在无偏向*的游戏中 AGT 和 ATSV 的期望值,依次是 3.96 和-32.9。更有意思的是,概率论会告诉我们,在无偏向*的游戏中 AGT 和 ATSV 的值是如何分布的,换句话说,它可以帮助我们计算出观察到某一特定 AGT 和 ATSV 值的概率。所谓的“** t 检验”可以把所有这些数值考虑进去并得出我们想要的 p 值。详细内容这里略过,有兴趣的可以参照概率与统计的相关内容。
从本文的角度出发我们选择 N=100 作为我们玩这个待检验的游戏程序的*数,得到了***水平值为 0.05。
胜率估计
除了 AGT 和 ATSV 之外,我们也想评估一下对于“无偏向*”的蜘蛛**程序来讲,“真正的”获胜概率。一个明显的困难在于胜率是和玩家有关的,所以很难验证“一个玩家能赢 50% 的游戏”这种说法。另一个情况是我在不同的蜘蛛**游戏程序中得到了从 45% 到 60% 的胜率,我的胜率并不随着时间增加而呈现出正相关)。
一个比较有意思的免费****游戏网站 Pipkin's Idiot's Delight Solitaire Server,这里面包含了许许多多的**游戏。它允许玩家在从 1 到 999999 的数字中指定一个“**数”。举例来说,如果**数为 142857,起始的 10 张牌就总是 2J56J9JQ59 这几张,但是组合方式会不同。要注意的是,要是玩家在游戏之前随机生成一长串**数,正是因为这个原因,可以选择这个网站来估计胜率。
在零假设为真的时候拒绝零假设被称为**类错误,它出现的概率等于***水平。假说检验中的另一类错误被称为第二类错误,它是指在零假设为假的情况下接受零假设。
我在 Idiot's Delight 上玩了 100 *游戏,使用了从 1 到 100 的**数。最终我赢了 59 *,输了 41 *。所以我估计我在玩“无偏向*”的蜘蛛**游戏的时候胜率会在 59% 左右。
估计值
我在 Free Spider Solitaire 上玩了 100 *蜘蛛**游戏。虽然选择了在这里玩游戏但是试验之后,这里的游戏体验真的很“糟糕”:尽管可以赢,但是就算高手玩家玩起来也会很困难。我观察到 AGT 和 ATSV 的 p 值依次是 0.115 和 0.201。玩家会吃亏),但是因为这两个数值都高于我们的 0.05 的阈值,它们在统计上都不**:这可能是因为偶然变化导致了较低的值的出现。
不幸的是我只赢了其中的 46 *,比预期少了 13 *。这说明可能还需要进一步测试验证。然而要知道每个玩家的胜率都不一样,我很有可能在这 100 *里还没有发挥出**状态。
46 *的胜*数是有一点让人沮丧,但是确实,这次这个程序经受住了考验。然而其他的蜘蛛**程序可能就没这么幸运了。
审校:Nuor
用于传递更多信息,节省甄选时间,结果仅供参考,IT之家所有文章均包含本**。






发表评论