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

时间:2015-11-10 02:41:40

标签: python random shuffle

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

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

其次,更重要的是,这是生成这些随机列表的最佳方法吗?目的是每当新主题进入时能够运行该脚本,以便每个主题具有与他/她相关联的三个随机列表。 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)])

2 个答案:

答案 0 :(得分:1)

问题是你不断为你生成的新变量分配相同的列表,因此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))

答案 1 :(得分:0)

啊,我显然是蟒蛇新手。我需要使用代码

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

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