使用约束来混洗列表

500*_*500 5 wolfram-mathematica random-sample

准备一个新的心理物理实验,我有48次原始刺激显示4次(4个条件),导致192次试验.试图在实验过程中随机化演示的顺序,我需要最大化相同原始刺激的4显示之间的距离.

请考虑 :

Table[{j, i}, {j, Range[48]}, {i, Range[4]}]
Run Code Online (Sandbox Code Playgroud)

其中j是原始刺激数和我的条件

输出样本:

 {{1, 1}, {1, 2}, {1, 3}, {1, 4}, 
  {2, 1}, {2, 2}, {2, 3}, {2, 4},   
  ...
  {47, 1}, {47, 2}, {47, 3},{47, 4}, 
  {48, 1}, {48, 2}, {48, 3}, {48, 4}}
Run Code Online (Sandbox Code Playgroud)

我怎样才能改变这192个项目的呈现顺序,最大化相同项目之间的距离j,原始刺激数量?

Sjo*_*ies 9

您必须在随机性和原始刺激之间的最大距离约束之间做出妥协.当您在4个相同的48个刺激系列(非随机呈现)中排列刺激时,获得最大距离.在这种情况下,对于每个原始刺激,距离固定为48.

如果你完全随机分配192对,原始刺激之间的平均距离平均为38.6,最小和最大可能距离分别为1和144:

t = Flatten[Table[i, {4}, {i, 48}]]; 

{Mean[#], StandardDeviation[#]} &@  
Table[
  rs = RandomSample[t, 192];
    Mean[Mean[Differences[Flatten[Position[rs, #]]]] & /@ Range[48]] // 
   N, {10000}
]

(* ==> {38.60370417, 1.397151004} *)
Run Code Online (Sandbox Code Playgroud)

你可以采用不同的方式.首先将48个刺激分成2个24块(1-24 [块I]和25-48 [块II]).然后产生I和II的随机排列(p):p(I)p(II)p(I)p(II)p(I)p(II)p(I)p(II).

现在平均距离变为:

{Mean[#], StandardDeviation[#]} &@  
Table[
  rs = 
    Join[RandomSample[Range[24]], RandomSample[Range[25, 48]], 
         RandomSample[Range[24]], RandomSample[Range[25, 48]],
         RandomSample[Range[24]], RandomSample[Range[25, 48]], 
         RandomSample[Range[24]], RandomSample[Range[25, 48]]
    ];
  Mean[Mean[Differences[Flatten[Position[rs, #]]]] & /@ Range[48]] //N, {10000}]

(* ==> {48., 0.} *)
Run Code Online (Sandbox Code Playgroud)

所以我们现在有一个更随机的呈现,而平均距离仍然是48(现在最小距离是24,最大距离是47).注意标准差为0.作为练习,我将保留为什么必须如此的证明.


更新1
我在这里安排了两组刺激,1-24和25-48.我建议你在开始分成两组之前为每个主题使用一个新的随机初始安排.这将为受试者带来一些额外的平衡.


更新2
现在,刺激条件组合生成的代码:

首先,在所有刺激上随机化条件:

m = MapThread[
       List, 
       {
         Table[Range[48], {4}], 
         Table[RandomSample[{1, 2, 3, 4}], {48}]\[Transpose]
       }, 2
    ]
Run Code Online (Sandbox Code Playgroud)

然后,以24人为一组进行分组,将其洗牌,并安排为一个列表:

Flatten[RandomSample /@ Partition[Flatten[m, 1], 24], 1]
Run Code Online (Sandbox Code Playgroud)

为了使每个主题的顺序随机化(正如我在上面的更新1中所建议的那样),第一部分需要进行一些小改动:

initialArrangement = RandomSample[Range[48]]; 
m = 
 MapThread[
    List, 
    {
       Table[initialArrangement, {4}], 
       Table[RandomSample[{1, 2, 3, 4}], {48}]\[Transpose]
    }, 2
 ]
Run Code Online (Sandbox Code Playgroud)

请注意,将第一行(RandomSample[Range[48]])置于其中是非常错误的Table!


对于Mr.Wizard这里的中缀符号版本显示我真的在尝试;-)

m~Set~MapThread[List, (Range[48]~Table~{4}~
    List~((RandomSample[{1, 2, 3, 4}]~Table~ {48})\[Transpose])), 2]
Run Code Online (Sandbox Code Playgroud)

第二部分:

(RandomSample /@ m~Flatten~1~Partition~24)~Flatten~1
Run Code Online (Sandbox Code Playgroud)

第一部分的变化,如上所述:

initialArrangement~Set~RandomSample[Range[48]]; 
m~Set~MapThread[List, (initialArrangement~Table~{4}~
    List~((RandomSample[{1, 2, 3, 4}]~Table~ {48})\[Transpose])), 2]
Run Code Online (Sandbox Code Playgroud)

BTW忘记第二部分中的括号和输出虽然看起来很相似,但却完全错了.