【问题标题】:consecutive runs of shuffle function yielding same order连续运行 shuffle 函数产生相同的顺序
【发布时间】:2015-11-10 02:41:39
【问题描述】:

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

首先,这段代码有什么问题,使得三个列表具有相同的顺序(即 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)])

【问题讨论】:

  • 你试过用random.seed([x])初始化随机生成器吗?

标签: python random shuffle


【解决方案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))

【讨论】:

  • 非常感谢元组建议。我喜欢通过这个论坛了解不同方法的知识。谢谢你的帮助。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多