心理学の実験では、多くの場合、試行順序を疑似ランダム化する必要があります。これにより、試行がランダムに見えるようになりますが、同様の試行が連続して多くなりすぎることはありません (純粋にランダムな順序で発生する可能性があります)。
各トライアルの視覚的表示に色とサイズがあるとします。
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 のチャンクに分割すると、各チャンクには各色と各サイズのペアが含まれます。実験の設計から順列が何であるかを知っているので、試行リストは常にこれらの順列チャンクに分割できると仮定しましょう。 - チャンクごとの最大実行長を選択します
- 各チャンクの実行の長さが最大値を下回るまで、各チャンクをシャッフルします (これは実際には、1 つのチャンクの最後にこの長さの実行がある可能性があるため、試行リスト全体で、実行がその長さの 2 倍になる可能性があることを意味します)。そして次の始まり)