在python中,random.shuffle
将列表的元素混合在一起。
我想知道是否保证在shuffle之后元素将处于不同的顺序或者它是否真的是随机的,在这种情况下我希望元素的顺序与shuffle之前的顺序相同超出N!
洗牌时间。
答案 0 :(得分:1)
之后列表可能会以相同的顺序。
请注意,如果您对大型列表进行随机播放,则由于伪随机数生成器中的状态数量有限,因此不能所有排列。
答案 1 :(得分:0)
这是一个实验,它确认了正如预期的那样,大约有1个是n!时间random.shuffle()
修复了元素。对于每个数字n,在1到9的范围内,我将获得身份置换的理论概率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
,除非我增加试验次数,否则我不会看到任何使元素固定的洗牌。