Python 循环内的独立随机洗牌
我正在使用模块Python 循环内的独立随机洗牌,python,loops,random,shuffle,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) 我是否可以完全确定第二次洗牌将与第一次完全独立 从结果来看,我的印象是输出不是独立的。但也
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)
我是否可以完全确定第二次洗牌将与第一次完全独立
从结果来看,我的印象是输出不是独立的。但也许这只是我的印象
例如,我得到的4个数字和4个重复的输出如下[1,3,2,4],[1,3,2,4],[4,1,3,2]和[1,4,3,2]。这是偶然发生的吗?可能是的。但我想确定一下
上下文:可能是因为我想为m学生安排考试的n题。但我想让每个学生都独立完成这个过程 您可以对此进行测试。请注意,只有4个=24个数字的排列1,2,3,4
。你应该期望在随机抽样中,这些排列中的每一个出现的可能性都是一样的。为了向自己证明这会导致您正在寻找的均匀分布,请对序列进行采样:
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()
请注意,红色虚线是理论预期值,蓝色线是我们从采样中获得的值。从这一点上,我很有信心我们得到了一个统一的分布,但我们总是可以用一个公式来量化它。这没有测试序列之间的相关性。这同样可以通过使用具有一定时间延迟的序列对进行测试,但是pythons使用的Fisher-Yates-shufflerandom.shuffle
很好地防止了这种情况 出于实用目的,对random.shuffle的连续调用是独立的。它需要log(N!)/log(2)个状态位来描述元素的唯一顺序,快速检查random.getstate()显示默认的伪随机数生成器实际使用20000个状态位。为了达到有意义的重叠,我们需要消耗所有的熵
所以我们需要M*log(N!)/log(2)>=20000才能得到一个已知的(但很难预测的)相关性。这不是不可能想象的;200名学生有28个问题。然而,这种关联性大于他们拥有30488834461171386050150400000个可能订单的可能性很小 这是Python的random
模块中的实际代码:
for i in reversed(xrange(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = _int(random() * (i+1))
x[i], x[j] = x[j], x[i]
在我看来像是一个真正的费舍尔·耶茨,完全独立于
以前的任何运行。输出是什么?为什么你会从中得到这样的印象?人类善于评估随机性。你需要如何确定洗牌是“独立的”?你所说的独立是什么意思?请注意,完全相同的顺序可能会再次随机出现。你有没有考虑过,如果这很重要的话?是的,我知道人类不善于评估随机性。但是我只是想知道我是否需要在我的代码中采取一些额外的措施(比如重置种子),或者这样做是否合适。我不熟悉这个python模块。例如,我得到的一个输出是这样的:它可能是偶然发生的吗?当然,每次都会得到[1,2,3,4]
,但这并不意味着它不是随机的。这是偶然发生的吗?不,random
严格来说是伪随机的,不是真正的随机。那有关系吗?几乎肯定不是!如果两个学生得到的问题顺序相同(或者顺序之间有某种联系),为什么这很重要?