这些是初中数学的知识点了,我们再抽象一点,把
f
看作是对象(不一定是数)上的一个操作(
operation
),这个操作同样有定义域和值域,以及对应关系,这个对应(
x, y
)的全体构成的集合也就定义了这个操作了。那么同实数上的函数,这个操作的性质则为:该操作和反操作的效果完全相同,或者,两个同样的操作以后会恢复原状!注意哦,这是可以早就两种完全不同魔术效果的原理哦,一个是“相同”,构造
coincidence
,还有一个是,还原(哈哈,这里不是撕牌还原的
restoration
啦,不要想偏了)!
巧了,上面描述的这个事情在数学上早就有名字了,他们统一叫做对称关系,即对任意关系集
A
,若
(a, b)
属于
A
则
(b, a)
也属于
A
,按理说这种元素倒转后形成的新元组所在集合可以是
A
’
,当且仅当
A = A
’
(这种样子的表达式是不是经常见到,那个矩阵的逆和自身相等则为单位阵的结论是不是长的差不多?)时候,这个关系称之为对称关系。当然对称关系只是等价关系的条件之一,后面有机会再分析其他两个(传递性,自反性)。当关系满足一一对应的时候我们称之为函数关系,这里即对称函数,在不同领域有不同名字,比如实数上的函数叫沿
y = x
对称,空间上我们称之为镜像关系(
mirror
),而在扑克牌这里,我取名
reverse
操作,它是对称关系在序列空间上的具体形式,与镜像这些概念构成
counterpart
关系,当然,
counterpart
关系也是对称关系了。
于是,扑克牌手法中的普通的一张一张发牌(
dealing
),恰好等价于对扑克牌顶部的一部分牌执行
reverse
操作,嗯嗯,在程序员看来就是这样的:
#! /usr/bin/env python
# -*- coding:utf8 -*-
import numpy as np
import random
poker_list = range(54)
np.random.shuffle(poker_list)# shuffle the deck
n = random.randint(1, 54)# choose a position randomly
result_list = poker_list[:n]# get the pack from the top
result_list.reverse()# reverse it