Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环内的独立随机洗牌_Python_Loops_Random_Shuffle - Fatal编程技术网

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-shuffle
random.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
严格来说是伪随机的,不是真正的随机。那有关系吗?几乎肯定不是!如果两个学生得到的问题顺序相同(或者顺序之间有某种联系),为什么这很重要?