利用SQL解释一个魔术

昨天在星夜上看到一个扑克的魔术,很有意思。

 

 

首先描述一个这个魔术,从一副扑克牌中随意抽取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表示这张牌的位置,分别是从121。而后将牌平均分成3份,于是这张牌的位置变为CEIL(P/3),在将这部分牌放到3份牌的中间,也就是说前面方式7张牌,因此结果要加上7

将这个过程重复3次,就是这张牌的最终位置。

根据计算结果,可以看到无论这张牌在哪里,最终都会到底第十一张的位置。这也就是这个魔术的奥秘所在。

不过SQL只是演示了结果,并没有给出为什么会出现这种结果,下面通过数学手段简单分析一下:

由于第一次平均分的时候,这张牌的位置是任意的,所以这次平均分的意义不大,这次平均分的目的只是将目标牌的那一份放到中间的位置。

所以可以认为这张牌在中间位置第17的任何一个位置上。现在这张牌的位置就是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的位置是17,也就是说无论取何值,(1+p)/9都不会大于1,所以最终结果是11

最后,应该修改一下那句话:“你要相信数学,你的牌是

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-557385/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-557385/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值