在python中,random.shuffle就地打乱列表的元素。
我想知道是否可以保证元素在混洗后会有不同的顺序,或者它是否真的是随机的,在这种情况下,我希望元素的顺序与混洗之前相同,大约平均1次N!混洗。
发布于 2016-01-19 07:27:58
这是一个实验,它证实了,正如预期的那样,n中大约有1!random.shuffle()修复元素的次数。对于1到9范围内的每个数字n,我将获得单位排列的理论概率1/n!与通过运行random.shuffle 100万次获得的观察比例进行比较:
import random, math
def trialShuffles(n,k):
#shuffles [1,2,...,n] k times
#returns number of times original order results
fixedPoints = 0
nums = list(range(1,n+1))
for i in range(k):
copy = nums[:]
random.shuffle(copy)
if copy == nums: fixedPoints += 1
return fixedPoints
test = [(n,1.0/math.factorial(n),trialShuffles(n,1000000)/1000000.0) for n in range(1,10)]
print("n theoretical observed")
print("------------------------")
for (n,x,y) in test:
print("%i %f %f"%(n,x,y))一次运行的结果:
n theoretical observed
------------------------
1 1.000000 1.000000
2 0.500000 0.499393
3 0.166667 0.166490
4 0.041667 0.041898
5 0.008333 0.008347
6 0.001389 0.001448
7 0.000198 0.000165
8 0.000025 0.000022
9 0.000003 0.000002显然,包含n=1是没有意义的,但它会让输出看起来更好。如果我去n = 10,我很可能不会看到任何让元素固定的混洗,除非我增加了试验的数量。
发布于 2016-01-19 06:16:15
列表可以在之后按相同的顺序排列。
请注意,如果您混洗一个大列表,由于伪随机数生成器中的状态数量有限,并不是所有的排列都是可能的。
https://stackoverflow.com/questions/34865006
复制相似问题