当前位置 博文首页 > boysoft2002的专栏:shuffle什么意思?python模拟随机发牌(斗地

    boysoft2002的专栏:shuffle什么意思?python模拟随机发牌(斗地

    作者:[db:作者] 时间:2021-07-11 12:41

    shuffle什么意思?

    除了翻译成“拖曳摇摆地走;搅乱;推诿,推卸”,还有洗牌的意思,随机不重复

    Shuffle?the cards and deal out five?to each?player.

    Python random 模块除了有以下常用的函数外:

    random()? ? ? ? ? ?返回0<=n<1之间的随机实数n;
    choice(seq)? ? ? ?从序列seq中返回随机的元素;
    getrandbits(n)? ?以长整型形式返回n个随机位;
    sample(seq, n)? 从序列seq中选择n个随机且独立的元素。

    还有一个“随机发牌”函数: shuffle():

    >>> from random import shuffle
    >>> n = [2, 3, 4, 5, 6, 7, 8, 9]
    >>> shuffle(n)
    >>> n
    [7, 5, 6, 2, 4, 9, 3, 8]
    >>> shuffle(n)
    >>> n
    [4, 6, 2, 3, 7, 8, 5, 9]
    >>> 

    直接随机打乱原序列的顺序排列,刚好可以用它来模拟发牌。

    一副扑克牌54张,四种花色,每种13张,另加大小王各一张。

    三人斗地主用一副,掼蛋则是四人用两副牌,每人27张牌。

    扑克牌表示如下(其中10用字母T来表示):

    >>> F = ('?', '?', '?', '?')
    >>> V = tuple(str(i) for i in range(2,10))+('T','J','Q','K','A')
    >>> V
    ('2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A')
    >>> 

    大小王分别用 Rj, Bj 表示:

    >>> P = [f+v for f in F for v in V] + ['Rj','Bj']
    >>> P
    ['?2', '?3', '?4', '?5', '?6', '?7', '?8', '?9', '?T', '?J', '?Q', '?K', '?A', 
     '?2', '?3', '?4', '?5', '?6', '?7', '?8', '?9', '?T', '?J', '?Q', '?K', '?A', 
     '?2', '?3', '?4', '?5', '?6', '?7', '?8', '?9', '?T', '?J', '?Q', '?K', '?A', 
     '?2', '?3', '?4', '?5', '?6', '?7', '?8', '?9', '?T', '?J', '?Q', '?K', '?A', 
     'Rj', 'Bj']
    >>> 

    用shuffle()函数随机洗牌:

    >>> from random import shuffle
    >>> shuffle(P)
    >>> P
    ['?T', '?6', '?6', '?2', '?4', '?6', '?A', 'Rj', '?J', '?7', '?2', '?K', '?4',
     '?3', '?4', '?9', '?A', '?3', '?K', '?8', '?J', '?4', '?K', '?5', '?K', '?8',
     '?7', '?8', '?6', '?9', '?A', '?T', '?9', '?5', '?Q', '?2', '?5', '?T', '?A',
     '?3', '?8', '?2', '?T', '?Q', '?7', '?Q', 'Bj', '?J', '?9', '?5', '?3', '?7',
     '?Q', '?J']
    >>> shuffle(P)
    >>> P
    ['?T', '?4', '?4', '?2', '?J', '?8', '?T', '?3', '?Q', '?8', '?4', '?6', '?Q',
     '?5', '?7', '?T', '?A', '?9', '?9', '?5', '?2', '?7', '?Q', '?7', '?K', '?3',
     '?6', '?K', '?3', '?6', '?6', 'Rj', '?7', 'Bj', '?2', '?9', '?8', '?4', '?K',
     '?8', '?T', '?2', '?3', '?9', '?A', '?J', '?5', '?A', '?Q', '?5', '?A', '?J',
     '?K', '?J']
    >>> 

    分发一副扑克牌成3堆:

    >>> C = [P[i:i+18] for i in range(0,54,18)]
    >>> for c in C:print(c)
    
    ['?T', '?4', '?4', '?2', '?J', '?8', '?T', '?3', '?Q',
     '?8', '?4', '?6', '?Q', '?5', '?7', '?T', '?A', '?9']
    ['?9', '?5', '?2', '?7', '?Q', '?7', '?K', '?3', '?6',
     '?K', '?3', '?6', '?6', 'Rj', '?7', 'Bj', '?2', '?9']
    ['?8', '?4', '?K', '?8', '?T', '?2', '?3', '?9', '?A',
     '?J', '?5', '?A', '?Q', '?5', '?A', '?J', '?K', '?J']
    >>> 

    两副扑克洗牌后分发成4堆:

    >>> from random import shuffle
    >>> F = ('?', '?', '?', '?')
    >>> V = tuple(str(i) for i in range(2,10))+('T','J','Q','K','A')
    >>> P = [f+v for f in F for v in V] + ['Rj','Bj']
    >>> P = P * 2
    >>> shuffle(P)
    >>> C = [P[i:i+27] for i in range(0,108,27)]
    >>> for c in C:print(c)
    
    ['?J', 'Rj', '?3', '?6', '?Q', 'Bj', '?J', '?K', '?Q',
     '?4', 'Rj', '?4', '?4', '?J', '?2', '?A', '?9', '?A',
     '?K', '?8', '?3', '?5', '?4', '?7', '?6', '?T', '?7']
    ['?5', '?6', '?J', '?7', '?5', '?2', '?T', '?9', '?9',
     '?3', '?6', '?8', '?Q', '?2', '?8', '?Q', '?T', '?2',
     '?7', '?4', '?Q', '?5', '?9', '?A', '?K', '?4', '?6']
    ['?J', '?3', '?7', '?6', '?T', '?7', '?3', '?9', '?8',
     '?8', '?6', '?T', '?K', '?K', '?5', '?9', '?6', '?4',
     '?A', '?7', '?8', '?2', '?3', '?T', '?7', '?T', '?K']
    ['?4', '?3', '?5', '?K', '?8', '?3', '?2', '?Q', '?T',
     '?2', '?J', 'Bj', '?8', '?2', '?A', '?A', '?A', '?J',
     '?Q', '?5', '?J', '?Q', '?9', '?K', '?5', '?A', '?9']
    >>> 

    扑克牌分别按花色和大小排序:

    >>> sorted(C[0])
    ['Bj', 'Rj', 'Rj', '?4', '?4', '?6', '?7', '?9', '?A',
     '?J', '?J', '?T', '?2', '?A', '?J', '?K', '?Q', '?3',
     '?4', '?8', '?Q', '?3', '?4', '?5', '?6', '?7', '?K']
    >>>
    >>> sorted([c[1]+c[0] for c in C[0]])
    ['2?', '3?', '3?', '4?', '4?', '4?', '4?', '5?', '6?',
     '6?', '7?', '7?', '8?', '9?', 'A?', 'A?', 'J?', 'J?',
     'J?', 'K?', 'K?', 'Q?', 'Q?', 'T?', 'jB', 'jR', 'jR']
    >>> 

    10以上的大小排序:

    >>> C[0]
    ['?J', 'Rj', '?3', '?6', '?Q', 'Bj', '?J', '?K', '?Q',
     '?4', 'Rj', '?4', '?4', '?J', '?2', '?A', '?9', '?A',
     '?K', '?8', '?3', '?5', '?4', '?7', '?6', '?T', '?7']
    >>> V = [10+'TJQKAj'.index(c[0]) if c[0] in 'TJQKAj' else ord(c[0])-48 for c in [c[1] for c in C[0]]]
    >>> V  # 把牌面大小转化成数字
    [11, 15, 3, 6, 12, 15, 11, 13, 12, 4, 15, 4, 4,
     11, 2, 14, 9, 14, 13, 8, 3, 5, 4, 7, 6, 10, 7]
    >>> S = [(C[0][i],V[i]) for i in range(27)]
    >>> S
    [('?J', 11), ('Rj', 15), ('?3', 3), ('?6', 6), ('?Q', 12),
     ('Bj', 15), ('?J', 11), ('?K', 13), ('?Q', 12), ('?4', 4),
     ('Rj', 15), ('?4', 4), ('?4', 4), ('?J', 11), ('?2', 2),
     ('?A', 14), ('?9', 9), ('?A', 14), ('?K', 13), ('?8', 8),
     ('?3', 3), ('?5', 5), ('?4', 4), ('?7', 7), ('?6', 6),
     ('?T', 10), ('?7', 7)]
    >>>
    >>> S1 = sorted(S,key=lambda x:x[1])
    >>> S1
    [('?2', 2), ('?3', 3), ('?3', 3), ('?4', 4), ('?4', 4),
     ('?4', 4), ('?4', 4), ('?5', 5), ('?6', 6), ('?6', 6),
     ('?7', 7), ('?7', 7), ('?8', 8), ('?9', 9), ('?T', 10),
     ('?J', 11), ('?J', 11), ('?J', 11), ('?Q', 12), ('?Q', 12),
     ('?K', 13), ('?K', 13), ('?A', 14), ('?A', 14), ('Rj', 15),
     ('Bj', 15), ('Rj', 15)]
    >>> S2 = sorted(S,key=lambda x:x[1],reverse=True)
    >>> S2
    [('Rj', 15), ('Bj', 15), ('Rj', 15), ('?A', 14), ('?A', 14),
     ('?K', 13), ('?K', 13), ('?Q', 12), ('?Q', 12), ('?J', 11),
     ('?J', 11), ('?J', 11), ('?T', 10), ('?9', 9), ('?8', 8),
     ('?7', 7), ('?7', 7), ('?6', 6), ('?6', 6), ('?5', 5),
     ('?4', 4), ('?4', 4), ('?4', 4), ('?4', 4), ('?3', 3),
     ('?3', 3), ('?2', 2)]
    >>> [s[0] for s in S2]
    ['Rj', 'Bj', 'Rj', '?A', '?A', '?K', '?K', '?Q', '?Q',
     '?J', '?J', '?J', '?T', '?9', '?8', '?7', '?7', '?6',
     '?6', '?5', '?4', '?4', '?4', '?4', '?3', '?3', '?2']
    >>> [s[0] for s in S1]
    ['?2', '?3', '?3', '?4', '?4', '?4', '?4', '?5', '?6',
     '?6', '?7', '?7', '?8', '?9', '?T', '?J', '?J', '?J',
     '?Q', '?Q', '?K', '?K', '?A', '?A', 'Rj', 'Bj', 'Rj']
    >>> 

    整合成一行代码:

    >>> [s[0] for s in sorted([(C[0][i],[10+'TJQKAj'.index(c[0]) if c[0] in 'TJQKAj' else ord(c[0])-48 for c in [c[1] for c in C[0]]][i]) for i in range(27)],key=lambda x:x[1])]
    ['?2', '?3', '?3', '?4', '?4', '?4', '?4', '?5', '?6', '?6', '?7', '?7', '?8', '?9', '?T', '?J', '?J', '?J', '?Q', '?Q', '?K', '?K', '?A', '?A', 'Rj', 'Bj', 'Rj']
    >>> 

    完整的2副牌洗牌发牌代码:

    >>> from random import shuffle
    >>> P = [f+v for f in ('?','?','?','?') for v in ([str(i) for i in range(2,10)]+list('TJQKA'))*2]+['Rj','Bj']*2
    >>> shuffle(P)
    >>> C = [P[i:i+27] for i in range(0,108,27)]
    >>> Player = lambda p:[s[0] for s in sorted([(p[i],[10+'TJQKAj'.index(c[0]) if c[0] in 'TJQKAj' else ord(c[0])-48 for c in [c[1] for c in p]][i]) for i in range(27)],key=lambda x:x[1])]
    >>> for i in range(4):Player(C[i])
    
    ['?2', '?3', '?4', '?4', '?4', '?5', '?5', '?5', '?6', '?6', '?8', '?8', '?8', '?9', 
    '?9', '?9', '?T', '?T', '?J', '?J', '?Q', '?K', '?A', '?A', '?A', 'Rj', 'Rj']
    ['?2', '?2', '?3', '?3', '?3', '?4', '?5', '?6', '?6', '?6', '?6', '?7', '?7', '?8', 
    '?8', '?8', '?9', '?9', '?T', '?J', '?J', '?J', '?Q', '?K', '?K', '?A', 'Bj']
    ['?2', '?2', '?2', '?3', '?3', '?4', '?4', '?4', '?5', '?7', '?7', '?7', '?7', '?9', 
    '?T', '?T', '?T', '?T', '?J', '?Q', '?Q', '?Q', '?K', '?K', '?A', '?A', '?A']
    ['?2', '?2', '?3', '?3', '?4', '?5', '?5', '?5', '?6', '?6', '?7', '?7', '?8', '?8', 
    '?9', '?9', '?T', '?J', '?J', '?Q', '?Q', '?Q', '?K', '?K', '?K', '?A', 'Bj']
    >>> 
    >>>
    >>> #再次发牌:
    >>> def Poker(P):
    		shuffle(P)
    		for i in range(4):print(Player([P[i:i+27] for i in range(0,108,27)][i]))
    
    >>> Poker(P)
    ['?2', '?2', '?3', '?3', '?3', '?4', '?6', '?6', '?7', '?7', '?8', '?9', '?9', '?9', 
    '?T', '?J', '?J', '?J', '?J', '?Q', '?Q', '?Q', '?K', '?K', '?A', 'Rj', 'Bj']
    ['?2', '?2', '?3', '?4', '?4', '?5', '?5', '?5', '?7', '?8', '?8', '?8', '?8', '?9', 
    '?T', '?T', '?T', '?T', '?J', '?J', '?Q', '?Q', '?K', '?A', '?A', '?A', '?A']
    ['?2', '?4', '?5', '?5', '?5', '?6', '?6', '?6', '?6', '?6', '?7', '?7', '?7', '?8', 
    '?8', '?8', '?9', '?9', '?T', '?T', '?J', '?Q', '?K', '?K', '?A', '?A', 'Bj']
    ['?2', '?2', '?2', '?3', '?3', '?3', '?3', '?4', '?4', '?4', '?4', '?5', '?5', '?6', 
    '?7', '?7', '?9', '?9', '?T', '?J', '?Q', '?Q', '?K', '?K', '?K', '?A', 'Rj']
    >>> Poker(P)
    ['?4', '?4', '?4', '?4', '?5', '?5', '?5', '?7', '?7', '?8', '?8', '?8', '?8', '?9', 
    '?9', '?T', '?T', '?T', '?T', '?J', '?J', '?Q', '?Q', '?K', '?K', '?K', '?K']
    ['?2', '?2', '?3', '?3', '?3', '?5', '?6', '?6', '?6', '?6', '?7', '?8', '?8', '?8', 
    '?9', '?9', '?9', '?J', '?Q', '?Q', '?Q', '?A', '?A', '?A', '?A', 'Rj', 'Rj']
    ['?2', '?2', '?2', '?3', '?3', '?4', '?4', '?4', '?5', '?6', '?6', '?6', '?7', '?7', 
    '?9', '?9', '?T', '?T', '?J', '?J', '?J', '?Q', '?K', '?K', '?A', '?A', 'Bj']
    ['?2', '?2', '?2', '?3', '?3', '?3', '?4', '?5', '?5', '?5', '?6', '?7', '?7', '?7', 
    '?8', '?9', '?T', '?T', '?J', '?J', '?Q', '?Q', '?K', '?K', '?A', '?A', 'Bj']

    最后一次发牌,Player1家有4,8,10,K四个炸弹!^_^

    cs