点击链接查看第6集的魔术表演:《数学与魔术:完美洗牌》
一、洗牌的方法
将一副牌平均分成两份进行完美洗牌法,有两种方法,如图所示:
1、顶牌洗到第1张
不考虑下半部分的牌,如果设上半部分的牌中某张牌的位置为i
,那么这张牌经过完美洗牌法后位置就变成i*2-1
(奇数)。
例如,第2张牌去到了第3张的位置。
2、顶牌洗到第2张
同理,上半部分的牌中某张牌的位置变成了i*2
(偶数)。例如,第2张牌去到了第4张的位置。
二、考虑几个问题
1、问题1
如何运用两种完美洗牌法把第2
张牌洗到第21
张?
因为完美洗牌法只能把牌洗到第i*2-1
(奇数)张或者第i*2
(偶数)张,那么通过位置的奇偶就能知道该用哪种洗牌法了,可以采用由后往前倒推的方法。
例如,第21
张是奇数,那么只能是通过i*2-1
得到的,于是可以求出前一个位置i
为第11
张。同理可得出位置的变化为2, 3, 6, 11, 21
。
知道了位置的变化,就可以求出该用那种洗牌法洗牌。例如一开始黑桃A
在第2
张,要洗到第3
张的位置,所以要采用i*2-1
的方法,也就是第一种方法。
用python写的算法如下:
1 | # -*- coding : utf-8 -*- |
执行结果为:
1 | 位置变化 : [1, 2, 3, 6, 11, 21] |
算法如此简单,以至于心算也能很快完成,毫无压力。
视频里选定的牌是在第2
张,而上面的代码假定了选定的牌在第1
张,那么经过一次完美洗牌后选定牌就到了第2
张,就跟视频里的位置一样了。这样做能够比较容易观察出牌的位置变化。
牌的位置变化可以通过以下代码得出:
1 | #coding:utf-8 |
执行结果为:
1 | 原牌的顺序: |
由上面的执行结果可以看出,假设黑桃A
一开始的位置是1
,通过5
次完美洗牌后位置就变成了21
。
2、问题2
如何精确地把一副牌分成牌数相等的两部份?
答案是不用平均分。
可能很多人会产生一个错觉,以为两叠牌的牌数相等才能进行完美洗牌法,但在这个视频中并不需要,两叠牌的牌数允许存在误差。
魔术师把牌分成两半,误差张数一般在0~2
之间,也就是说两叠牌的张数差大于4
张就能感觉出来了。
魔术师表演魔术时是要去掉大小王牌的,整副牌有52
张,当误差为2
张时,上半叠牌可能会拿到24
张。为了保证把牌洗到某个位置的准确性,那么牌的最终位置最大只能为24 * 2 = 48
。
可能有人会问,如果魔术师用骰子得出的数字大于48怎么办?我认为这是不可能的。
因为骰子只有123456
,如果投出来的两个数字都大于等于5
,那么组合出的数字都大于52
,魔术师会重新投骰子。
如果其中一个数字小于5
,那么组合出来的数字最大是46
,在安全区内。
如果投出5
和2
,魔术师会说这是25
,而不会说是52
。
3、问题3
如何让一张牌隔着一张牌进行完美洗牌法?
这确实不难,很多年以前我上初中的时候,有一天在电视看到魔术师用了完美洗牌法,于是就买了一副牌研究,练习了一两天就成功了。
当时用的牌是两块钱一副的,练习起来比较难,如果用视频里的单车牌的话,完美洗牌是非常容易完成的。