昨天在星夜上看到一个扑克的魔术,很有意思。
首先描述一个这个魔术,从一副扑克牌中随意抽取21张牌。然后让人随意选择其中的一张牌,牢记后,将其放回到牌中,然后任意洗牌。
下面根据发牌的规则,将牌分成3堆,每堆7张。将每堆牌依次向对方展示,只需要对方确认他刚才记住的牌在其中的哪一堆中。
将3堆牌合成一堆,将包含目标牌的一堆牌放在其他两堆牌的中间。
然后再次发牌,还是分成3堆。让对方确认后,仍然将目标牌所在的那7张牌,放到另外两堆牌的中间。
最后再次重复发牌,确认的过程,仍然将确认的目标牌堆放在中间。
下面神奇的时刻来到了,从这堆扑克牌中每拿一张,说一个字:“你要相信魔术,你的牌是”,说完这些话,下一张牌就是对方所记的那张牌。
看上去这个魔术确实很神奇,不过既然魔术可以这样表演,就说明无论这张牌在哪个位置,只要按照这个规则,最后都一定会来到指定的地方。
下面用SQL来演示一下:
SQL> WITH A AS
2 (SELECT ROWNUM P FROM DUAL CONNECT BY LEVEL <= 21)
3 SELECT
4 7 + CEIL(
5 (7 + CEIL(
6 (7 + CEIL(P/3))
7 /3))
8 /3)
9 FROM A;
7+CEIL((7+CEIL((7+CEIL(P/3))/3))/3)
-----------------------------------
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
已选择21行。
简单描述一下,子查询中的P表示这张牌的位置,分别是从1到21。而后将牌平均分成3份,于是这张牌的位置变为CEIL(P/3),在将这部分牌放到3份牌的中间,也就是说前面方式7张牌,因此结果要加上7。
将这个过程重复3次,就是这张牌的最终位置。
根据计算结果,可以看到无论这张牌在哪里,最终都会到底第十一张的位置。这也就是这个魔术的奥秘所在。
不过SQL只是演示了结果,并没有给出为什么会出现这种结果,下面通过数学手段简单分析一下:
由于第一次平均分的时候,这张牌的位置是任意的,所以这次平均分的意义不大,这次平均分的目的只是将目标牌的那一份放到中间的位置。
所以可以认为这张牌在中间位置第1到7的任何一个位置上。现在这张牌的位置就是7 + p,下面平均分成三份,然后将目标牌堆放到中间,这是这张牌的位置变为7 + (7+p)/3,最后在重复一次这个动作,结果变为:7 + (7 + (7+p)/3)/3。
通分后,结果变成(7*9 + 7*3 + 7 + p)/9,进一步简化(91 + p)/9,最后变成了10 + (1+p)/9,而p的位置是1到7,也就是说无论取何值,(1+p)/9都不会大于1,所以最终结果是11。
最后,应该修改一下那句话:“你要相信数学,你的牌是”。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-557385/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-557385/