连续运行洗牌函数产生相同的顺序

consecutive runs of shuffle function yielding same order

我正在生成随机列表,但出于某种原因,这里的所有三个列表都以相同的顺序结束。两个问题:

首先,这段代码有什么问题使得三个列表具有相同的顺序(即 target1 = target2 = target3 和 jitter1 = jitter2 = jitter3)?

其次,更重要的是,这是生成这些随机列表的最佳方式吗?目的是能够在每次新主题进来时 运行 这个脚本,以便每个主题都有三个与 him/her 关联的随机列表。 shuffle 函数是否适合用于此目的(即在脚本中是随机的,如果我 运行 脚本在不同的日子有几百次不同的随机性)?

非常感谢您的帮助。

import random
import sys
import csv

N = 200 # number of targets
l = 3 # number of lists to generate
l += 1

# generate lists
targets_M = ['stimuli/Hangul_M'+str(x)+'.png' for x in range(N/2)]
targets_F = ['stimuli/Hangul_F'+str(x)+'.png' for x in range(N/2)]

targets_null = targets_M + targets_F

delays = list(range(3, 13, 1)) # 3 : 12, n = 10

jitter_null = delays * 20

# randomize lists
for j in range(1,l):
    globals()["targets"+str(j)] = targets_null
    random.shuffle(globals()["targets"+str(j)])
    globals()["jitter"+str(j)] = jitter_null
    random.shuffle(globals()["jitter"+str(j)])

问题是您一直将相同的列表分配给您生成的新变量,因此 random.shuffle 只是一遍又一遍地打乱原始列表。你应该先复印一份。

# randomize lists
for j in range(1,l):
    t = targets_null[:]
    random.shuffle(t)
    globals()["targets"+str(j)] = t
    jj = jitter_null[:]
    random.shuffle(jj)
    globals()["targets"+str(j)] = jj

像这样使用全局变量很尴尬。你可以只使用列表。假设您想将抖动与目标相关联,您可以将它们放在一个元组中。

# randomize lists
targets = []
for _ in range(1,l):
    t = targets_null[:]
    random.shuffle(t)
    j = jitter_null[:]
    random.shuffle(j)
    targets.append((t,j))

啊,我显然是 python 的新手。我需要使用代码

globals()["targets"+str(j)] = targets_null[:]

复制变量,而不仅仅是跟随 targets1 targets2 和 targets3 都指向的原始变量的指针。学过的知识。无论如何,仍然对最好的随机化方案感到好奇。谢谢!