完美洗牌
“完美洗牌”是一种看上去随机实际上有规律的洗牌方式,是把一副牌精准分成两半,每一半的每一张和另一半的每一张交替合在一起。完美洗牌分“外洗牌”和“内洗牌”两种方式。
外洗牌
一副牌平均分成上下两部分,交替顺序为上1、下1、上2、下2……,这样顶部的第一张永远是第一张,底部的最后一张也永远是最后一张。52张牌只要8次外洗牌就可以恢复初始状态。
内洗牌
一副牌平均分成上下两部分,交替顺序是下1、上1、下2、上2……,这样会有一个看上去混乱的序列。52张牌需要52次内洗牌才能恢复初始状态。
完美洗牌除了在魔术娱乐方面的作用外,还是数学上一个非常经典的例子。在计算机方面,完美洗牌以O(N)的时间复杂度和空间复杂度实现数据混淆,并且这种混淆是可逆的。
我第一次看到这个词是在二十年前的天涯论坛上,作者腾飞发布的一部小说里;这部小说现在出版的名字叫《我的老千生涯》。这是一本反赌博的书,我买来主要想给孩子看,让他对赌博这个事有个基本的认识。这本书非常好,里面揭露了很多江湖上做局的手段,我在之前的文章里也提到过,看这里。
用Python实现
对于一副新牌,去掉大小王后,剩下的52张,从背面开始的顺序是这样的:方片K~A,梅花K~A,红桃K~A,黑桃K~A,之所以从背面开始数,就是洗牌肯定是背面朝上来洗的。一副新牌可以标记为[51,50,49…,1,0],花色是元素值除以13的整数部分(3,2,1,0),大小是元素值除以13的余数部分(12,11,…0).
"""
对列表进行完美洗牌(Perfect Shuffle / Faro Shuffle)。
参数:
numbers: 需要进行洗牌的列表。注意:列表长度为偶数,
如果是奇数,由于整数除法和zip的特性,最后一个元素会被丢弃。
times: 洗牌的次数,默认为 1 次。
is_out_shuffle: 布尔值,决定洗牌的方式,默认为 True。
True: 执行 Out-Shuffle(外洗),原列表上半部分的元素在新一对中排在前面。
False: 执行 In-Shuffle(内洗),原列表下半部分的元素在新一对中排在前面。
"""
def perfect_shuffle(numbers, times = 1, is_out_shuffle = True):
half = len(numbers) // 2
shuffled = numbers
for _ in range(times):
up = shuffled[:half]
down = shuffled[half:]
shuffled = []
for a, b in zip(up, down):
if is_out_shuffle:
shuffled.append(a)
shuffled.append(b)
else:
shuffled.append(b)
shuffled.append(a)
return shuffled
def init():
# [51, 50, 49 ... 1, 0]
return list(range(51, -1, -1))
def display(poker):
suit_list = ['黑桃', '红桃', '梅花', '方片']
num_list = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
cards = [f"{i:2} - {suit_list[i // 13]}{num_list[i % 13]}" for i in poker]
return '\n'.join(cards)
if __name__ == '__main__':
new_poker = init()
print('新扑克初始顺序:')
print(display(new_poker))
times = 23
is_out_shuffle = False
print(f"完美洗牌{'外' if is_out_shuffle else '内'}洗{times}次后:")
shuffled = perfect_shuffle(new_poker, times, is_out_shuffle)
print(display(shuffled))输出如下:
新扑克初始顺序:
51 - 方片K
50 - 方片Q
49 - 方片J
48 - 方片10
47 - 方片9
46 - 方片8
45 - 方片7
44 - 方片6
43 - 方片5
42 - 方片4
41 - 方片3
40 - 方片2
39 - 方片A
38 - 梅花K
37 - 梅花Q
36 - 梅花J
35 - 梅花10
34 - 梅花9
33 - 梅花8
32 - 梅花7
31 - 梅花6
30 - 梅花5
29 - 梅花4
28 - 梅花3
27 - 梅花2
26 - 梅花A
25 - 红桃K
24 - 红桃Q
23 - 红桃J
22 - 红桃10
21 - 红桃9
20 - 红桃8
19 - 红桃7
18 - 红桃6
17 - 红桃5
16 - 红桃4
15 - 红桃3
14 - 红桃2
13 - 红桃A
12 - 黑桃K
11 - 黑桃Q
10 - 黑桃J
9 - 黑桃10
8 - 黑桃9
7 - 黑桃8
6 - 黑桃7
5 - 黑桃6
4 - 黑桃5
3 - 黑桃4
2 - 黑桃3
1 - 黑桃2
0 - 黑桃A
完美洗牌内洗23次后:
7 - 黑桃8
15 - 红桃3
23 - 红桃J
31 - 梅花6
39 - 方片A
47 - 方片9
2 - 黑桃3
10 - 黑桃J
18 - 红桃6
26 - 梅花A
34 - 梅花9
42 - 方片4
50 - 方片Q
5 - 黑桃6
13 - 红桃A
21 - 红桃9
29 - 梅花4
37 - 梅花Q
45 - 方片7
0 - 黑桃A
8 - 黑桃9
16 - 红桃4
24 - 红桃Q
32 - 梅花7
40 - 方片2
48 - 方片10
3 - 黑桃4
11 - 黑桃Q
19 - 红桃7
27 - 梅花2
35 - 梅花10
43 - 方片5
51 - 方片K
6 - 黑桃7
14 - 红桃2
22 - 红桃10
30 - 梅花5
38 - 梅花K
46 - 方片8
1 - 黑桃2
9 - 黑桃10
17 - 红桃5
25 - 红桃K
33 - 梅花8
41 - 方片3
49 - 方片J
4 - 黑桃5
12 - 黑桃K
20 - 红桃8
28 - 梅花3
36 - 梅花J
44 - 方片6
附:《我的老千生涯》引子 惊梦 我就是传说中的老千
-腾飞-
多少年来,我总在梦里看到那双求助的眼神,她哀求地看着我,一次一次地看着我的眼睛……
我也算见过大世面的人了,但自从那件事后,我常会在同一个梦里惊醒,每次都会吓出一身冷汗,然后久久不能睡去。那个眼神我一辈子也忘不了,我不知道她——确切地说是她们——现在怎么样了。连续多少年我都做这个梦,我诚恳地希望她(们)能原谅我,不管多少钱,我愿意用钱补偿她,虽然钱赎不回来什么,但如今我只能做这些了。
这事说来话长。2001年秋天,秋老虎还很厉害,我住的城市,赌场没人愿意带我玩,相熟的人见我来了,甩我几千块,打发我走。我没事可做,成天就是跟朋友们去看热闹,很闹心。
正没事可做,从前赌场的朋友大军给我来电话,要我到天津帮忙抓千。
电话里他简单介绍了一下,这是一个北京老板开的赌场,开了好多年,因为根子硬,一直没倒。三个月前,赌场发现有人出千了,抓了很久也没抓到,请了不少高手去看,都没看出啥毛病。这个老板认准了非要搞个水落石出不可,所以还在到处找人。
那会儿我的技术早不是原来赌场小老千水准,大军就向老板推荐我去抓千。电话里大军还说他现在跟着这个老板做,老板对他很好;抓住有钱挣,看不出啥就当去旅游了。正好我们共同的朋友,也是带我入道的师傅大宾,也在天津,顺便聚一下。
那老板开出的价码是200万,我马上就心动了,当天就买了飞机票。下了飞机,大宾、大军都来接我,还有一个三十来岁的女人,穿得精干得体,大军给我介绍:“这是老板娘,特地欢迎你到天津来,老板有事,晚上就能见着。”
他们把我安顿到一家大酒店,留大宾陪着我,大军和老板娘就去忙了,还说晚上给我接风。生平头一回被人这样招待,忽然有了一种上等人的感觉。
下午快6点时,老板和老板娘都来了,看老板那样子有六十多(后来才知道那是个二老板娘)。吃饭时,我大致了解了一下赌场的内情,问老板赌场搞不搞鬼,大军接过话茬:“赌场百分百公平,所以这几年周边地区的大款都喜欢来这里赌。”
老板娘给了我两张卡,一张是会员卡,还有张VIP什么的金卡。这里没有会员卡是进不去的,包房里没有金卡也是进不去的。搞这么多规矩,我不由得心里暗暗骂娘。
赌场是晚上10点以后营业,我、大宾、大军约好,我假扮散客进去,大家装作互相不认识。
到了赌场才发现这地方规模真大,外面看是个很大门面的洗浴餐饮中心,各类设施都有。赌场在8楼,灯光映照下,一派华丽。大军让我自己去,结账时出示我的金卡就可以了。
晚上10点,要开工了,我到8楼,一个很开阔的大厅,有10多张桌子,每张桌子前都人头攒动,我穿着牛仔裤和白T恤,像个乡巴佬。一个挂着“楼面经理”牌子的中年男子路过我身边,递给我一叠东西,他递得很巧妙,旁人看不出我们俩交接东西。到没人的地方一看,是5个筹码,每个10万,金黄色的。
我挨个地方溜达着看,大军说作弊发生在百家乐台上,但不确定是哪个台子。我看见大军也穿着制服在里面溜达,经过他身边,我看了看他的牌子:值班经理。他没有给我一点提示。
我只好继续乱看,三个百家乐的台子摆在外面大厅,每个台前都挤满了人。每个台子前我都看了半小时,基本都没啥毛病。随后我转到贵宾区。贵宾区在一个大包房中,就一个台子,在玩百家乐,赌注大得吓人,其中应该有些像当官的,看上去不怒自威的样子。不过也有一个不顾形象地不停擦汗的倒霉人,包间里空调开得很大,莫非他汗腺太发达?
我正走神,大宾在后面拉我,他让我注意外面3号台上的三男二女。我到了3号台前,仔细观察。人都说,小偷看眼,我说抓老千就看手。我也注意到那五个人,他们看上去互相都不认识,各玩各的,他们押的都不大,所以不能看牌,也没机会出千,偶尔押大可以看牌。我注意力很集中,他们并没出千!他们押得很随意,赢了不少,面前堆着高高的筹码。
直到早上5点散场,我也没看出什么毛病,觉得很郁闷。刚回酒店,大军就来问我观察的结果。大军说:“他们来了基本都赢钱,这五个人互相认识,但是从不说话,每天不是这个人赢,就是那个人赢,三个多月来一直这样。他们也不是天天来,也不是一起到来,但是可以肯定他们互相认识,几个人的账算下来,肯定赢,不会输。”
从他那里还了解到,怀疑归怀疑,各路人马来抓,都没抓到什么把柄。这个老板可以算是开赌场的领军人物了,对真本事赢钱走的,多少都奉陪;但是说人家出千,却没拿到把柄,说出去会坏了名誉。
我跟大军解释说:“整晚我都盯着他们,但是一直没发现什么毛病,他们押得很随便,大的7万,小的5000,不动牌,不可能出千。”
赌场事后也查过废牌,没查出什么毛病。第二天我又去,这五个人没来。
第三天,我在赌场又看到了他们,只是变成了两男一女。他们也是挨个到百家乐台去玩,并不固定。我特别注意了一下百家乐台上的牌楦和桌子,都是按照国际标准制作的东西,应该也没问题,我也一直在他们玩的台子上乱押。如果他们真是老千,应该是很高段的老千,有点要细水长流赢钱的感觉。
到底是哪里出了毛病,我竟然完全看不出来。那时候,我自认为是一个千术高手了,不管是什么高科技还是再快的手法,很难瞒过我的眼睛。我又看了一夜,确定他们没出千,可是他们又赢了,这个又该如何解释呢?
天天赢的人有,可是连续三个月都赢的人,我没见过。
一个星期过去了,我还是没发现什么蛛丝马迹,赌场的老板、老板娘表面不说什么,但我能感觉到人家对我的失望与冷落,他们托大军捎过话来“实在抓不到就别抓了”,还感谢我老远来捧场。听了这番话,我一阵脸热。我这个人脾气属于犟驴,怎么能叫人家这样轻看呢?
当天我就搬出了酒店,换了一家(因为那酒店的所有费用是大军老板掏的,我怎么还能老着脸继续去住啊)。
但是我和大军说:“我坚决不走,一定要看看到底啥毛病。”大军也没说啥,每次我进了赌场也都偷偷递码给我,卡也都没和我要,就当我免费给他打工一样。
我到天津12天了,事情出现了转机。那天,我早早去了赌场,坐在2号台子上,像别人一样优雅地喝着咖啡。赌场开局的时候,荷官(主持台面的司仪)带着赌具,身后跟了两个派码的小丫头,来到了台前。
确认场上的人都够了可以开局了,那个荷官丫头就把八副扑克都打开了,给大家验看。验完,就开始哗哗地洗牌。2001年开始,国内赌场跟着国际大赌场走,把自动洗牌机撤掉,改成手洗了,只准荷官洗牌;2003到2005年玩家也可以参与洗牌;2005年之后,大赌场开出一个专门房间,四面透明,玩家可以从外面清楚地看到里面的洗牌动作,牌洗好后,扑克走哪个桌上由抽签决定。
那个荷官小丫头长得不错,水汪汪的大眼睛,睫毛很长,小脸鼓鼓的,皮肤特别好,看着就有要掐一下的冲动,所以不由得对她注意了起来。看着丫头哗哗地洗牌,我就研究起了她的手,像水葱似的。看着看着,我好像发现了什么。她密密麻麻地洗着扑克,洗得实在太好了,我的心不由一跳。
这个荷官有问题!
但是当时不十分肯定,我起身去别的台子溜达去了。找个没人的地方把大军喊去,问大军:“2号台子的荷官会不会有问题?”
大军被我问得一愣,摇摇头说:“怎么可能?那是老板的亲戚,老板一手栽培起来的。再说了,那牌楦是黑色的,按照国际赌场规格做的,绝对作不了假。”他拍拍我的肩膀,“三儿,你是不是抓不到有点神经了?”
我不理会他的嘲笑,又问大军:“是不是每次这个丫头的台子上那些人都赢呢?”大军却说:“不是,哪个台子都赢过。你不要瞎寻思了,荷官绝对不可能有问题,如果有问题也逃不出我的眼睛。”
我又迷糊了,难道我看错了?我怎么觉得这个手法这么熟悉呢?
第一局八副牌快完了,我又凑过去,那个女人已经赢了20万了。这局结束,她去了1号台子,我顺着她走过去的地方看,经常和她一起的男人在1号台上押着钱。那台上的荷官是个岁数稍大的丫头,长得也不错,笑眯眯的样子,那个男人也赢了7万多的样子。
真他妈邪门。
看到2号台又拆了新的八副牌,我又过去看丫头洗牌,还是很正常地洗,一样密密麻麻,她洗得真是太好了,难道我看岔眼了?
大军恰巧不在,我转身找到另一个值班经理,提出要看监视录像,他请示后,带我进了他们的录像室。我要求重看丫头洗牌那一段。他们只注重押钱看牌区,那个录像的角度不太好,看得不是很清楚。我又要求看了前几天的,也不是很清楚,不过基本搬牌的动作还是可以看到的。看过后,我坚定了我的看法:是荷官出千了。但是我不敢肯定,我还要继续观察。
于是我又溜达去了场上,那几个人早走了,看着荷官下一轮的洗牌,也没看出啥来,但是我心里已经有数了。
第二天,我摩拳擦掌准备出手,不想那几个倒霉蛋没来。
第三天,我又早早进去,那几个倒霉蛋已经在那里了。我坐在2号桌子上,仔细观察那荷官洗牌,今天这台上是前天1号桌子上的那个丫头,那伙人在她台子上也赢了不少。当时,我装作数筹码,实际上是看她洗牌。
她也这样洗牌!我断定这两个荷官丫头靠洗牌帮助那几个人出千。她们的手法叫做完美洗牌,根据我第二个师傅的说法,1998年中国基本没人会,这个东西只存在于美国一些大赌场。简单地说,通过洗牌,牌都被编辑为有规律的顺序,只要计算准确,就能知道场上每个人将会发到什么牌。果然,那几个家伙遇到了熟识的顺序,他们基本都是下大注,他们吃不准的时候,就一通乱押。
我还吃不准牌的顺序,所以那天我没下手抓,早早回去,顺便买了台计算器和两副扑克,详细计算两副牌从洗牌1次至9次的详细顺序,直到第二天上午10点多才算完,然后我就硬背下来。
下午我早早就过去了,在他们酒吧喝酒,还给大军挂了个电话,让他来帮我付账:“我要了瓶好酒,包里钱不够了,你们的酒保想宰死我,一瓶酒要我6000多。”他听了哈哈大笑:“你这个傻×,应该宰。”不一会儿,二老板娘款款走来,大军跟在身后。我今天做好抓千的准备,心情很轻松,还有心开玩笑,说:“李姐,来给我付账啊。”
她笑了,回头对酒保说:“不用算了,这位先生的单一会儿我签。”然后转过头问我:“怎么还没走?”我笑嘻嘻说:“抓不到我不走了,我得赚这200万回去讨老婆。”
她看我这样,大概猜出我心里有数,就说:“只要你抓到了,200万以外我还可以再给,你说吧,还要什么条件。”
我故意逗她,狮子大开口:“我相中你们大军开的那车了。”
她很豪爽地说:“一点问题没有,只要你抓得到,我明天就给你提一辆过来。”
我马上说:“晚上给我准备100万筹码,今天晚上就给你抓到,除非他们不来!”
晚上他们果然来了。
我凑到他们台上,荷官丫头完美地洗了7次,然后把洗好的牌都放在一起,切好牌,削去牌,放进牌楦,赌局开始了。
刚开始,那几个倒霉蛋都心不在焉地押着钱,我也一样乱扔一通,心里默默计算着下一个应该是啥牌,那几个家伙也是很专注地看。当然了,场上所有玩家都很专注,赌的可都是真金白银。几轮过去,我终于看到了熟识的顺序,和我计算的一样,而那几个人也注意到了,他们开始下大筹码,每次都可以推算出下一张是什么牌,补出来的是哪些牌,当然会赢了。
我觉得我应该出手了。
我站了起来,把裤兜里所有的筹码都掏出来,场上的玩家看我一下拿出这么多金黄色的大码,都很吃惊,好像还有小声嘀咕:“装×来了,有钱就去贵宾室玩呀!”
我假装没听见。
我算好了,下次应该是闲家补了牌以后大,我就把所有的筹码都堆到了闲家,说:“闲家我包了,庄家押多少我都带着。”
荷官微笑着说:“先生你必须放个准确数字,不可以这样押钱的,别人没押,你最多只可以押10万,庄家增加了你才可以再增加。”
“是吗?那我就先10万,庄家上多少我都带。”大家拿看愣头青的眼神望着我,谁也不说话。荷官派牌,不用说我赢了。
下一把,我算出庄家会赢,就包了庄家,当然也赢了。第三次我又包了场上的钱,也赢了。可能我的举动太嚣张,很多人都不玩了,凑了过来看热闹。
大军这时站到了我的身后,表情很专注,一声不吭看着我表演。
我连续六次通吃,那些说我装×的反过来都要求我带他们一点。这时候荷官小丫头的表情不再自然,笑得很僵硬。
当我包第11场的时候,那丫头可能明白了我已看出她的把戏,她说话的时候嘴角有点抖,她用哀求的目光看着我,一次一次地看着我的眼睛,那眼神里分明说希望我能就此过去。
可是我当时满脑子只想着钱,如果老天爷让我重新来过一次的话,我绝对不去揭穿她!
大军知道我抓住了,马上派来一些人维持现场秩序,无关的人都被清理到了一边,出千的那几个男女见势不妙,正要溜走,被赌场的人强行留下。
不一会儿,二老板娘也进来了,说发现赌场有人出千,需要核实,暂时停业一会儿,每个人到酒吧去,酒水全免单,就这样无关的人都被请到酒吧。
赌场的人把这张桌子团团围住,赌局还在继续,可那荷官丫头发牌的手越来越抖,最后连牌都发不出来了。
“继续发!”二老板娘大声呵斥着,那丫头已经掩面蹲在了桌子边上,呜呜哭着。我给大军解释下几张都是什么牌,为什么会有这个效果,然后我要了两副扑克,给大家演示完美洗牌,那些看场子的发出一片惊呼,以为我在变魔术。之后我又要了两副扑克,先后洗了7次(跟那个荷官丫头一样),然后展开在赌桌上,把牌楦里的扑克都拿出来展开,和我洗好的两副扑克对比,找出同样次序的,排列给大家看:一模一样!
二老板娘指着另一个会完美洗牌的荷官丫头问我:“老三,那边台子上呢?”我很得意,说:“1号、2号应该是这样的,3号没多大问题。”
话音刚落,一个男人过去把那边台的荷官像提小鸡一样提了过来。她知道被揭穿,也早抖成了筛子。
我正洋洋得意着,随后一幕让我的得意变成终生的悔恨。只听一声尖叫,地上多了一颗眼珠子,那个荷官丫头疼得满地打滚,一边发出凄厉的叫声。从那以后我经常做噩梦,到了晚上,高一点的声音就会让我汗毛直竖。从此,我也给自己定了个规矩,任何人找我抓千,必须事前约定不得伤人,否则不去抓。
后来,我听说赌场老板给这个荷官家200万摆平这件事。不管怎么说,这两个丫头很大程度是因为我受到这么大的伤害,如果有机会,我希望能补偿她们,但我不敢奢求她们的原谅。
这是我第一次出面抓千,当天就被人保护起来了。第二天,赌场给了我200万,我分给大军50万,要给大宾50万,大宾没要。这个赌场老板确实讲信用,真的把车钥匙给了我,并立刻拿给我所有手续。我一再表示那天我是开玩笑,奈何他非要给我,我不要就要打要杀的,我只好要了。走的时候把车给了大宾。
晚上老板在最豪华的饭店请了我,说了很多感谢的话,还让我以后多和他联系。具体那两个丫头和那些倒霉蛋是啥关系我没问,她们怎么练的也没问。我打听怎么处理的,可是他们死活不说,问大军,他也不说。
然后,我离开了那个城市。