心理学实验通常要求您对试验顺序进行伪随机化,这样试验显然是随机的,但您不会连续获得太多类似的试验(这可能发生在纯随机排序中)。
假设每次试验的视觉显示都有颜色和大小:
display_list = []
colours = {0: 'red', 1: 'blue', 2: 'green', 3: 'yellow'}
sizes = [1] * 20 + [2] * 20 + [3] * 20 + [4] * 20 + [5] * 20 + [6] * 20
for i in range(120):
display_list.append({'colour': colours[i % 4], 'size': sizes[i]})
print(display_list)
我们可以使用此函数查看对于任一属性具有相同值的连续试验的最大数量:
def consecutive_properties(seq, field):
longest_run = 0
prev_value = None
current_run = 0
for d in seq:
if d[field] == prev_value:
current_run += 1
else:
current_run = 1
if current_run > longest_run:
longest_run = current_run
prev_value = d[field]
return longest_run
输出:
>>> print("Consecutive colours: ", consecutive_properties(display_list, 'colour')
('Consecutive colours: ', 1)
>>> print("Consecutive sizes: ", consecutive_properties(display_list, 'size'))
('Consecutive sizes: ', 20)
您是否知道任何算法可以最小化其中一个或两个属性的连续运行,或者至少将这些运行保持在指定长度以下?如果是后者,假设同一颜色或大小的一行中不超过 4 个。
我试过的:
我现在拥有的解决方案基本上做了一个稍微智能的bogosort,它的效率必须非常低。基本上:
- 您将整个列表分成包含所有属性排列的块:如果您分解
display_list
为长度为 24 的块,则每个块的每种颜色都与每种大小配对。让我们假设试验列表总是可以分解成这些排列块,因为您从实验设计中知道排列是什么。 - 您选择每个块的最大运行长度
- 你打乱每个块,直到每个块的运行长度低于最大值(这实际上意味着在整个试验列表中,你的运行可能是那个长度的两倍,因为你可以在一个块的末尾运行这个长度和下一个的开始)