杨廷琨 - 用SQL解析神奇的扑克牌魔术

杨廷琨,网名 yangtingkun

云和恩墨技术总监,Oracle ACE Director,ACOUG 核心专家

老杨带你用SQL解释经典的扑克牌魔术


一个偶然的机会在电视上看到一个有关扑克牌的魔术,觉得很有意思。这个魔术明显不是靠手快或者做假来实现的,奥妙在于魔术中包含了数学原理。

一个魔术

首先描述一下这个魔术,有兴趣的话,可以按照这个方法试一试。

从一副扑克牌中随意抽取21张牌。让观众从这些牌中随意选择一张,这张牌就是最后通过魔术需要找到的目标牌。让观众牢记后将其放回到其余20张牌中,然后任意洗牌。

下面开始进行发牌的工作,发牌和普通扑克的发牌规则一样。将牌发成3叠,每叠7张。将每叠牌依次展示给观众,要求观众确认目标牌在3叠的哪一叠中即可。

之后将3叠牌合在一起,将包含目标牌的一叠放在其他两叠牌中间。注意此时不要打乱每叠牌的顺序。

然后再次发牌,和刚才完全一样,还是将牌发成3叠。让对方确认目标牌所在的一叠,将这叠牌放到另外两叠牌的中间。

最后,再次重复上面的发牌、确认此过程,仍然将包含目标牌的那叠牌,放到另外两叠牌的中间。

下面神奇的时刻到来了:从这叠扑克牌的上面每次拿起一张,每拿起一张牌的同时要说一句话:“你要相信魔术你的牌是”。说完这句话,下一张牌就是目标牌了。

看上去这个魔术很神奇,而且最神奇的是,这个魔术任何人都可以来表演。这就说明无论这张牌最初在哪个位置,只要按照这个规则最后都一定会来到这个指定的位置。

SQL求解

看了这个魔术,不禁有点手痒,既然是DBA出身,就用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行。

详细解析SQL逻辑

解释一下这个SQL:

设WITH查询中的P表示这张牌的初始位置,这个位置的取值范围是从1到21。而后将牌按照发牌的顺序分成3份,于是这张牌的位置变为CEIL(P/3)。由于在魔术表演的过程中,目标牌所在的那一叠牌会放在其他两叠牌的中间,也就是说目标牌的前面增加了7张牌,因此目标牌的位置要增加7。

魔术中上面的步骤重复了3次,因此在SQL中这个过程也重复3次,最终SQL返回的结果就是目标牌21种不同初始位置所对应的魔术结束时刻目标牌的最终位置。

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

不过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。

最后,应该修改一下魔术中咒语:“你要相信数学你的牌是”。

近期文章

新年贺礼:云和恩墨大讲堂期刊发行

2015 Oracle 十大热门文章精选

Oracle 12c ASM 防火防盗新特性揭秘

DBA入门之路:学习与进阶之经验谈

DBA入门之路:关于日常工作的建议

三十八载,Oracle伴我同行—记我的成长之路

从Approx_Count_Distinct到M7的CPU集成

诊断工具与方法:从OS到数据库

Cloud时代DBA的DevOps最佳实践 - SQL 审核

Oracle Database 12.2新特性详解

数据驱动,成就未来。整合业界顶尖的技术与合作伙伴资源,围绕数据及相关领域,提供解决方案和专业服务。

业务架构

电子渠道(网络销售)分析系统、数据治理

IT基础架构

分布式存储解决方案

数据架构

Oracle DB2 MySQL NoSQL

专项服务:架构/安全/容灾/优化/整合/升级/迁移

运维服务:运维服务 代维服务

人才培养:个人认证 企业内训

软件产品:SQL审核、监控、数据恢复

应用架构

应用软件和中间件:数据建模 | SQL审核和优化 | 中间件服务

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-01-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

理解数据仓库中星型模型和雪花模型

4273
来自专栏数据小魔方

超强脑洞第五弹——ggplot 构造连环饼图

今天这篇之前曾有涉略过,就是利用ggplot的辅助插件工具——scatterpie制作基于气泡图的饼图,之前曾在地图图层上演示过此种类似图表,不过这里我将其与折...

3505
来自专栏有趣的Python和你

Python数据分析之方差分析

设某苗圃对一花木种子制定了5种不同的处理方法,每种方法处理了6粒种子进行育苗试验。一年后观察苗高获得资料如下表。已知除处理方法不同外,其他育苗条件相同且苗高的分...

782
来自专栏SeanCheney的专栏

阿姆达尔定律和古斯塔夫森定律摘要背景建议使用指南更多资源

摘要 构建软件的并行版本可使应用在更短的时间内运行指定的数据集,在固定时间内运行多个数据集,或运行非线程软件禁止运行的大型数据集。 并行化的成功通常通过测量并行...

2516
来自专栏杨建荣的学习笔记

使用sql语句分析双色球(85天)

这个题目看似有点无厘头,老写技术博客,也来干点“正事",用sql语句分析一下近十年来的双色球情况,不过我肯定算不出来开奖结果,纯属个人娱乐, 个人觉得概率让一切...

2626
来自专栏大数据和云计算技术

构想下一代优化器MBO:MachineLearning Based Optimizer

熟悉ORACLE数据库的人,对RBO/CBO肯定很熟。 Rule Based Optimizer(RBO)基于规则 Cost Based Optimizer(C...

3508
来自专栏嵌入式程序猿

【电机控制不得不学习的干货:】 飞思卡尔MCU正交编/解码器模块

在电机控制领域,我们经常需要得到电机的转速,位置来执行算法,那么想知道转速是如何获得的吗?看过来,猿来你在这里O(∩_∩)O~ 正交编码器简介 飞思卡尔增强型正...

26211
来自专栏生信技能树

使用R语言的cgdsr包获取TCGA数据

前些天被TCGA的终结新闻刷屏,但是一直比较忙,还没来得及仔细研读,但是笔记本躺着的一些TCGA教程快发霉了,借此契机好好整理一下吧,预计二十篇左右的笔记

1263
来自专栏我是攻城师

如何合理的控制solr查询的命中的数量和质量?

3425
来自专栏https://www.cnblogs.com/L

【自然语言处理篇】--Chatterbot聊天机器人

ChatterBot是一个基于机器学习的聊天机器人引擎,构建在python上,主要特点是可以自可以从已有的对话中进行学(jiyi)习(pipei)。

1395

扫码关注云+社区