这个游戏在解决什么问题
电脑从0~9中选出几个互不相同的数字排成密码,您输入同样位数的数字,得到的只有“几个A、几个B”的提示,不会告诉您具体哪一位错了。因此每一次提示都要当作一道小小的逻辑题来读。它的本质是排除法:在成千上万种可能的密码里,每个提示都能去掉“不可能产生这个提示”的那一批。运气好可以一次猜中,但只要留意每次猜测把候选范围缩小了多少,同样位数下尝试次数会明显减少。在华语地区,这类游戏常以“1A2B”的形式玩,国际上一般称作Bulls and Cows;本页的提示用A、B表示,下文会解释含义。
如何读懂提示
- A:数字正确且位置也正确的个数。
- B:数字在密码中存在,但位置不对的个数。
- A+B:您输入的数字中有多少个属于密码。即使不知道位置,也可以先单独判断“密码里有哪些数字”。
- 0A0B(全不中):输入的数字全都不在密码里,这些数字之后都可以排除。
本工具中密码与每次猜测都必须是互不相同的数字,0~9中任何数字都可以放在首位(像0123这样的密码也存在)。位数不对、数字重复,或包含半角0~9以外的字符(例如全角数字),都只会显示错误提示,不计入尝试次数。使用中文输入法时请切换到半角数字再输入。
组合数量表
从10个数字里取n个互不相同的数字按顺序排列,总数为10×9×8×……(共n项相乘)。一次猜测能得到的提示种类,等于满足A+B不超过n的(A,B)组合数,再减去不可能出现的“A=n-1且B=1”这一种。下表在生成页面时直接计算。
| 位数 | 可能的密码总数 | 可能出现的提示种类 |
|---|---|---|
| 3位数 | 720种 | 9种 |
| 4位数 | 5,040种 | 14种 |
| 5位数 | 30,240种 | 20种 |
一次猜测携带的信息量不会超过提示种类的数量。4位数时,5,040种密码一次最多只能分成14组;三次猜测最多区分 14×14×14=2,744 种提示序列,小于5,040,所以任何方法都不能保证三次内必定猜中。一两次就猜中只能靠运气。
第一次猜测如何分割候选
4位数时若第一次猜0123,下表是对5,040种密码逐一计算后,每种提示对应的密码个数。
| 得到的提示 | 剩余候选数 | 占比 |
|---|---|---|
| 0A1B | 1,440 | 28.6% |
| 0A2B | 1,260 | 25.0% |
| 1A1B | 720 | 14.3% |
| 1A0B | 480 | 9.5% |
| 全不中(0A0B) | 360 | 7.1% |
| 0A3B | 264 | 5.2% |
| 1A2B | 216 | 4.3% |
| 2A0B | 180 | 3.6% |
| 2A1B | 72 | 1.4% |
| 3A0B | 24 | 0.5% |
| 0A4B | 9 | 0.2% |
| 1A3B | 8 | 0.2% |
| 2A2B | 6 | 0.1% |
| 4A0B | 1 | 0.0% |
最常见的提示占全部密码的四分之一以上,而4A0B(猜中)在5,040种里只有1种。剩余候选多的提示说明这次“运气不佳”,像1A3B、2A2B这样少见的提示则能大幅缩小范围。表中没有3A1B,正是因为它不可能出现。
解题思路
- 前两三次先找出密码包含哪些数字。用重叠很少的数字组合猜测,汇总A+B。例如0123的合计为2、4567的合计为1,那么剩下的那1个数字必然在8或9之中。
- 之后只猜与所有已有提示都不矛盾的密码。这样每一次都有可能直接猜中,即使没中,候选也一定在减少。打开上方的“显示剩余候选数”,可以看到每次猜测缩小了多少。
- 通过对调位置确认每个数字的位置。比较两次只对调了两个数字的猜测,A的变化就能说明这两个位置的情况。
- 出现0A0B就把这些数字全部划掉。这是信息量最大的结果之一。
简单方法平均需要几次
为了有个参照,对每一个可能的密码都运行了一种很朴素的策略:每次都猜“与已有提示不矛盾的数字最小的那个密码”。3位和4位数是全部密码,5位数因计算量按每10个取1个(3,024种)抽样。
| 位数 | 平均次数 | 最多用到的次数 |
|---|---|---|
| 3位数 | 约5.27次 | 9次 |
| 4位数 | 约5.56次 | 9次 |
| 5位数(抽样) | 约6.01次 | 9次 |
这只是该简单策略的测量值,并不是最优策略的平均次数。选择更能均匀分割候选的猜法可能做得更好,但最优值未在本页核实,所以不写出。
验算示例
示例1:提示怎么算。 密码是1234,猜1243:1和2位置也对,是2个A;4和3数字对但位置互换,是2个B,即2A2B。猜4321则四个数字都在密码里却一个位置都不对,为0A4B。猜5678没有任何重合,为0A0B。
示例2:4位数密码8051。 用上述朴素策略,第7次猜中。
| 次数 | 猜测 | 提示 | 猜测前候选数 |
|---|---|---|---|
| 1 | 0123 | 0A2B | 5040 |
| 2 | 1045 | 1A2B | 1260 |
| 3 | 1254 | 1A1B | 72 |
| 4 | 1406 | 0A2B | 25 |
| 5 | 5034 | 1A1B | 4 |
| 6 | 7051 | 3A0B | 3 |
| 7 | 8051 | 4A0B | 2 |
第一个提示0A2B就把5,040种缩到1,260种,第三次之后只剩几十种。最后几步较慢,是因为剩下的候选只有一处不同。
示例3:3位数密码729。 同样的策略依次猜012(0A1B)→134(0A0B)→256(0A1B)→507(0A1B)→680(0A0B)→729,共6次。候选数依次为720→252→80→24→6→1。两次0A0B让用过的数字被成批排除,效果最明显。
常见误区与局限
- 只看A+B的合计就去猜位置。合计只是“包含的个数”,位置要靠比较不同排列才能确定。
- 忘记首位可以是0。0可以出现在任何位置。
- 剩余候选数显示适合学习,但开启它赢下的对局不宜与不开启时的成绩相比较。
- 密码由浏览器的Math.random生成,只是游戏用的随机数,不能用于安全或抽奖。
- 尝试记录和结果不会保存,刷新页面即消失,也不会在设备间同步。
如何利用结果
结束后从第一次猜测开始向下看记录,想一想每次猜测究竟去掉了多少候选。几乎没有缩小范围的猜测,多半是在重复已知信息。能稳定在5次左右解出3位数后,再挑战4位数,最后是5位数,这是自然的进阶顺序。
常见问题
可以输入重复的数字吗?
不可以。猜测也必须由互不相同的数字组成,输入重复数字会提示错误,且不增加尝试次数。
首位可以是0吗?
可以。密码是把0~9打乱后取前n个得到的,所以0123这样的密码也会出现。因此3位数的总数是10×9×8=720种。
4位数时为什么不会出现3A1B?
如果有三位数字位置完全正确,密码中只剩一个位置未定。您输入的最后一个数字如果在密码里,就必然在那个位置,成为A;如果不在密码里就没有提示。没有可以成为B的位置,所以3A1B不可能出现。
为什么区分A和B?
A表示数字和位置都对,B表示数字对但位置不对,这是这类游戏通行的记法,国际上称作Bulls and Cows(公牛与母牛)。具体由来各资料说法不一,本页不作断定。
几次猜中算厉害?
上面的朴素策略在4位数时平均约5.6次,可作为参照。单局结果受运气和第一次猜测影响很大,建议看多局的平均而不是一局。