随机洗牌

随机洗牌

问题描述:给定一个0-9的数据,达到随机洗牌的效果,即让每个数字在每个位置上出现的概率一样,约为1/10

方法一:直接调用python中内置函数

import random
def shuffle_system(cards):
    random.shuffle(cards)  
    
def test_shuffle(f):
    result = [[0 for i in range(10)] for j in range(10)]

    for i in range(10000):
        A = [i for i in range(0, 10)]
        f(A)
        for j in range(len(A)):
            result[A[j]][j] += 1
    # 用一个“二维数组”,每一行表示不同数字在0-9这10个位置上的出现次数(假设循环了10000次,那么每个位置都应该约等于1000次)
    print('\n'.join([''.join(['{:6}'.format(item) for item in row]) for row in result]))  
--------------------------------Results
1036   990   998  1039   949   971   980  1015  1001  1021
991   1008   985   986  1027  1014  1020   990   965  1014
1005   998  1015   966  1015  1027  1031   955   996   992
 994  1002   991  1014  1007  1010   949  1012  1023   998
 988   998  1029   979  1014  1029   971  1000  1034   958
 976  1010   991  1015   988  1010  1047  1005   996   962
 962   965  1045  1035  1029  1032   964   977   986  1005
1019  1031   977  1025   983   989   990   998   968  1020
 986   998   996  1003   985   971   996  1014  1025  1026
1043  1000   973   938  1003   947  1052  1034  1006  1004
可以看出:00-910个位置的出现次数都约等于1000次,12,……9以此类推都是这个结果

方法2:自己手写
原理如下:
首先选择
首先选择第一个位置作为交换位,然后从0-9的数字的随机挑选一个位置放入0号位,概率为 1 10 \frac{1}{10} 101
然后选择第二个位置,从1-9位置的数字里挑一个进行较换:概率为 9 10 ∗ 1 9 = 1 10 \frac{9}{10}*\frac{1}{9}=\frac{1}{10} 10991=101
以此类推……,代码如下:

def shuffle_correct(array):
    N = len(array)
    for pos in range(N):
        exchange_pos = random.randint(pos, N-1)
        array[pos], array[exchange_pos] = array[exchange_pos], array[pos]
    return array

def test_shuffle(f):
    result = [[0 for i in range(10)] for j in range(10)]

    for i in range(10000):
        A = [i for i in range(0, 10)]
        f(A)
        for j in range(len(A)):
            result[A[j]][j] += 1
        
    print('\n'.join([''.join(['{:6}'.format(item) for item in row]) for row in result]))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值