好戏马上开始~

单人蜘蛛接龙(以下简称为“蜘蛛纸牌”)是人们经常在电脑上在线或者离线玩的一款很受欢迎的游戏。由名字可以看出,这个游戏是只有一个玩家的。游戏中一共有两套标准扑克牌,玩家需要按顺序把扑克牌排列成完整的八组(两套牌,各四种花色),从而进一步把它们从台面上消除。牌可以从牌组中提取或者按照特定规则从一列移动到另一列。我们这里不再详细地讨论游戏规则,假设我们的读者已经了解游戏的规则了。要是你需要回忆一下,可以看这里。在这里我们只讨论这个游戏的四组的版本。

蜘蛛纸牌中含有两套标准扑克牌

玩家们一直在抱怨说不同的软件存在偏差。具体来讲,就是如果程序探测到了玩家的胜率很高,它可能就暗中操纵后面的牌的次序来降低胜率。玩家本身也有可能被偏向从而发挥出最好水平。不过,通过一些基本的统计学手段,我们有可能对这种“偏向的指控”进行证实或者驳斥。这一点也可以作为一个很好的练习,来看看一个人是如何使用在现实世界观察到的数据并配合统计学手段来判断一个假说(比如“蜘蛛纸牌程序是有偏向性的”)是真的还是假的。

基础知识

从本文的角度出发,我们这里假设玩家在玩蜘蛛纸牌的时候不使用“撤销”“重来”“加步”(把游戏削减为一个简陋的初始版本),这样玩家就不用考虑计分、花费的时间以及移动的步数了。很多人都认为在这样的条件下游戏几乎赢不了,但是加州州立大学长滩分校的史蒂夫·布朗在他出色的著作《蜘蛛纸牌获胜策略》中给出了一些详细的策略,并且提到在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的值是多少。

示例,起始位置GT=1,TSV=-42

计算如下:

假设检验

为了检验一个蜘蛛纸牌游戏是不是有偏向性,我们采用一种叫假设检验的手段。我们先制定一个零假设(意思就是我们怀疑的效应可能不存在),在我们这里是指“蜘蛛纸牌程序并不存在偏向性”,那互补的假设就是“蜘蛛纸牌程序故意使绊子使得玩家的胜率下降”。

首先选取一个较大的数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数据。我观察到AGT和ATSV的p值依次是 0.115 和 0.201。这意味着AGT和ATSV的数据都要低于预期(也就是说,玩家会吃亏),但是因为这两个数值都高于我们的0.05的阈值,它们在统计上都不显著:这可能是因为偶然变化导致了较低的值的出现

不幸的是我只赢了其中的46局,比预期少了13局。这说明可能还需要进一步测试验证。然而要知道每个玩家的胜率都不一样,我很有可能在这100局里还没有发挥出最佳状态。

从中我给出的结论是没有足够的证据证明Free Spider Solitaire上的程序是有偏向性的。46局的胜局数是有一点让人沮丧,但是确实,这次这个程序经受住了考验。然而其他的蜘蛛纸牌程序可能就没这么幸运了。

作者:Trevor Tao

翻译:Dannis

审校:Nuor

原文链接:

https://plus.maths.org/content/spider-solitaire

我们是谁:

MatheMagician,中文“数学魔术师”,原指用数学设计魔术的魔术师和数学家。既取其用数学来变魔术的本义,也取像魔术一样玩数学的意思。文章内容涵盖互联网,计算机,统计,算法,NLP等前沿的数学及应用领域;也包括魔术思想,流程鉴等魔术内容;以及结合二者的数学魔术分享,还有一些思辨性的谈天说地的随笔。希望你能和我一起,既能感性思考又保持理性思维,享受人生乐趣。欢迎扫码关注和在文末或公众号留言与我交流!

扫描二维码

关注更多精彩

序列周期性与魔术(四)——周期序列数学性质深入探秘

《猫和老鼠》里的魔术艺术(五)——一定要合理!

扔硬币中的思考——隐含变量建模魔术里的集合、映射和关系(十)——天才之作《Tiny Berglas Effect》我和Double Lift的故事(五)——升华篇点击阅读原文,往期精彩不错过!

为了研究蜘蛛纸牌的规则,我玩了200局!相关推荐

  1. 收藏网页版小游戏:蜘蛛纸牌、扫雷、水果忍者、打地鼠、吃豆人

    学习之余当然是摸鱼了,这里分享几个不用下载直接在线玩耍的游戏.有蜘蛛纸牌网页版在线玩.在线扫雷小游戏.在线玩的水果忍者.吃豆人.打地鼠.3D模仿. 下面我将一个个列出来.欢迎体验收藏! 蜘蛛纸牌:这是 ...

  2. java程序设计蜘蛛纸牌_介绍程序员玩纸牌

    java程序设计蜘蛛纸牌 在玩扑克,二十一点和纸牌等经典纸牌游戏时,了解程序员的历史 (Learn about programmer history while you play classic ca ...

  3. 还记得蜘蛛纸牌吗?这个C++开发的小游戏,原来是这样玩的

    纸牌游戏是一款Windows休闲的棋牌游戏,是打发时间必备的经典游戏之一. 要将纸牌K到A依次排齐,桌面上所有的纸牌都被按照顺序排好以后就获胜.蜘蛛纸牌是电脑上经久不衰的小游戏,现在想起来是不是满满的 ...

  4. win10恢复经典开始菜单_没有蜘蛛纸牌的日子怎么过?带你找回Win10自带的游戏...

    小白系统 免费的人工客服 点击联系 相信许多已经将系统升级到Win10的朋友都很纳闷,以前的系统自带的游戏哪去了?找遍整个开始菜单都没有发现"游戏",难道Win10是放弃了这些游戏 ...

  5. 用python整个活(2)——用numpy做一个蜘蛛纸牌

    1,过程 蜘蛛纸牌大家玩过没有?之前的电脑上自带的游戏,用他来摸鱼过的举个手. 但是现在的电脑上已经没有蜘蛛纸牌了.所以-- 可不可以自己做一个呢? 想法有了,实践开始. 首先,应该怎么写?首选的方案 ...

  6. java蜘蛛纸牌_Java课程设计——蜘蛛纸牌

    一.团队名称.团队成员介绍.任务分配 团队名称:Panta 团队成员介绍 网络1713蔡炜明[组长] 201721123076 网络1713高枫    [组员] 201721123090 任务分配 网 ...

  7. 蜘蛛纸牌(Java)课设

    文章目录 摘要 1绪论 1.1编写目的 1.2系统分析与设计 1.3小组分工 2详细设计 2.1程序功能介绍 2.2程序流程 3功能分析 3.1主要界面 3.2 初始化纸牌及发牌操作 3.3纸牌移动放 ...

  8. java蜘蛛纸牌课程设计_Java课程设计——蜘蛛纸牌

    一.团队名称.团队成员介绍.任务分配 团队名称:Panta 团队成员介绍 网络1713蔡炜明[组长] 201721123076 网络1713高枫    [组员] 201721123090 任务分配 网 ...

  9. Java课程设计——蜘蛛纸牌

    一.团队名称.团队成员介绍.任务分配 团队名称:Panta 团队成员介绍 网络1713蔡炜明[组长] 201721123076 网络1713高枫    [组员] 201721123090 任务分配 网 ...

最新文章

  1. 神策数据张涛:AARRR 模型面临的新挑战
  2. 架构实战:(一)Redis采用主从架构的原因
  3. 滨江机器人餐厅_餐厅来了机器人服务员
  4. struts2访问jsp页面404
  5. JSP Servlet Mysql学生成绩管理系统
  6. hbase 查询_不用ES也能海量数据复杂查询秒回
  7. Spring学习笔记(一) 简介
  8. 固态硬盘比机械硬盘到底快多少呢
  9. 智能门锁电路图_蓝牙门锁原理图一览 蓝牙智能门锁工作原理介绍
  10. Meterpreter命令详解
  11. 8种Python文本处理工具集
  12. Java 标识符的命名规则与规范
  13. Win10系统无法使用VGAPlayer软件播放asf格式和VGA文件
  14. 介绍我国计算机的发展的作文600字,五年级描写电脑的说明作文600字
  15. GTP-3算法是一种“暴力美学”的胜利
  16. Autodesk Revit 2023 三维建模软件中文正式版安装说明
  17. Android 按电源键亮屏/息屏流程分析
  18. 【JMeter】Jmeter分布式压测教程
  19. 复旦大学计算机学院江湾校区,复旦大学江湾校区
  20. Nacos出现重大安全漏洞,开源项目险遭脱库

热门文章

  1. grpc调用_避免使用套接字远程过程调用以及如何使用grpc进行程序通信
  2. 数据治理:数据集成的关键技术
  3. apt更新显示以下错误消息Err:1 http://ports.ubuntu.com xenial InRelease Temporary failure resolving ‘ports.ubunt
  4. 个人工具开发【卡片式记忆面试题开发】v.1.0.3
  5. update (SELECT /*+BYPASS_UJVC*/
  6. 新手小白学JAVA Set HashSet Map HashMap
  7. 误删u盘文件夹怎么恢复
  8. matlab 调用java 代码(亲测可用)
  9. python打印星图_Python中的星图
  10. PS制做心形app图标