随机洗牌
问题描述:给定一个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
可以看出:0在0-9这10个位置的出现次数都约等于1000次,1,2,……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}
109∗91=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]))