扑克牌魔术的暴力算法——可用来骗美女哦

少年时有好友向我展示了一个扑克牌魔术:他拿出一副牌的A~10的所有牌共40张,洗乱,让我背着他拿走一张牌,接着他迅速地一张张浏览剩下的39张牌,浏览两遍之后,他准确地说出了拿走牌的点数和花色。这是一个不怎么优雅的扑克牌魔术,却是一个硬碰硬绝对没作弊的魔术。
如果你的计算力足够厉害,比如说你像Von Neuman,或者干脆你的脑袋就是电脑,那你可以给每张牌赋一个不同的值,先算出总数,等我拿走一张牌之后,你一遍算出剩下牌的值总数,就可以知道哪张牌是我被拿走的。
大部分人心算两位数的加减其实都已经很吃力了。好友的算法是,只加尾数。第一遍根据点数算出所有牌的个位数和,被10一减就可确定点数;第二遍根据点数确定花色。算时只做个位数加法,心算好的人可以把牌翻得浪快。当时我为了在心仪的mm面前好好表现一下该魔术,刻苦地训练了一番。但无奈自己的心算实在不佳,要么算到一半卡住,翻牌不连贯;要么在第二遍找花色时发现四张牌都在。失误率太高了,拿出手必定是偷鸡不成蚀把米,在美女面前丢脸下不了台。
人脑计算一位数的和比计算二位数快,而加数是1、2的时候更快。根据该原理我想到了一个好法子,可以大大减少人脑的计算难度,而且可以扩张到整幅牌。第一遍,确定花色。方法是给每种花色赋值,方块1,红桃2,草花3,黑桃0,做模4加法,即和超过4则减4(可用口诀来助记:332 代表3+3-4 = 2,  321,310,220,...),最终算出的和数,跟花色的对应关系是:1——方块,3——草花,0——红桃,2——黑桃。第一遍还得对大小王做特殊处理,记忆好的人直接留意一下即可;我的记忆力不好,是用脚趾来助记的,遇到大王左脚趾抓地,小王则是右脚趾。第二遍,根据所缺花色,确定点数。令J=-1,Q=-2,K=0,做模13求和,可确定所缺点数。
我改进的算法,在第一遍做的加法不超过3+3的难度(我还试过给草花赋值-1),第二遍只需算10次加法(加0不计),因为算的难度总体降低了,可较大提高准确率和速度。像我心算如此不佳的人,当时稍微训练了一下,在美女面前,都可以把牌翻得飞快,让美眉目不暇接、好奇心大起,从而跟美女多说了好多话。(原谅我,标题上说可用来骗美女,其实是实打实的在美女面前做苦算,诚心诚意博佳人一笑而已。)

最近想到了一个新问题:如果mm拿走的是两张牌,你能设计一个快速的翻牌方法来确定mm拿走的牌吗? 规定翻牌的方式翻一次只能看一张牌。
感觉这个问题很有挑战性,但也十分有趣,大家一起来献策献力吧^_^

posted @ 2009-04-08 17:42  对酒当歌  阅读(5267)  评论(19编辑  收藏  举报