python - 循环内独立随机洗牌

标签 python loops random shuffle

我正在使用模块random 来随机播放n 元素的数组。我需要执行 m 次,并且我不完全确定每次发生的洗牌都是独立的。

请参阅下面的示例:

for i in range(10):
    a = list(range(1,20))
    random.shuffle(a)
    print("\n\nSequence of numbers ")
    for item in a:
        print(item)

我可以完全确定第二次shuffle列表a将与第一次完全独立吗?

查看结果,我的印象是输出不是独立的。但也许这只是我的印象。

例如,我得到的 4 个数字和 4 次重复的输出如下 [1, 3, 2, 4]、[1, 3, 2,4]、[4, 1, 3, 2] 和[1,4,3,2]。这是偶然发生的吗?可能是。但我想确定一下。

上下文:可能我想订购我给 m 个学生的考试的第 n 个问题。但我希望每个学生都能独立完成这个过程。

最佳答案

你可以测试一下。请注意,数字 1,2,3,4 正好有 4!=24 种排列。您应该预期,在随机抽样中,这些排列中的每一个出现的可能性都是相同的。为了向自己证明这会产生您正在寻找的均匀分布,请对序列进行采样:

import random, math
from collections import Counter

samples = 1000000

a = list(range(1,5))
C = Counter()

for _ in xrange(samples):
    random.shuffle(a)
    C[tuple(a)] += 1

import pylab as plt
permutations = math.factorial(4)
expected = float(samples)/permutations
plt.plot(C.values())
plt.plot([0,permutations],[expected,expected],'r--')
plt.ylim(0,expected*2.01)   
plt.show()

enter image description here

请注意,红色破折号是理论预期值,蓝线是我们从采样中获得的值。由此我非常有信心我们得到了均匀分布,但我们总是可以使用 Kolmogorov Smirnov test来量化它。这测试的是序列之间的相关性。这可以再次使用具有一定时间延迟的生成序列对进行测试,但 python random.shuffle 使用的 Fisher-Yates shuffle 在防止这种情况方面做得很好。

关于python - 循环内独立随机洗牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27547700/

相关文章:

python - 打印 django 数据库中的数据

python - 为什么我得到 AttributeError : 'KerasClassifier' object has no attribute 'model' ?

Python:查找列表中的所有元素是否都相同,除了恰好 2 个数字

javascript - 循环无限嵌套对象并构造字符串

java - 使用 While 与 If 防止数组中出现重复的整数 ID 号

c# - C# 随机数生成器线程安全吗?

python - Google API 在生产中返回 invalid_grant 但在本地不返回

jquery如何使用for循环添加对象?

arrays - 随机选择一个类的实例化并显示?

vb.net - 需要生成 9 个小于 100 的唯一整数,使得没有两个整数的总和等于另外一/两个数字