使用约束来混洗列表

时间:2011-11-19 17:45:24

标签: wolfram-mathematica random-sample

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

请考虑:

Table[{j, i}, {j, Range[48]}, {i, Range[4]}]

其中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}}

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

4 个答案:

答案 0 :(得分: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} *)

您可以采用不同的方式。首先将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.} *)

所以我们现在有一个更随机的演示,而平均距离仍然是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
    ]

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

Flatten[RandomSample /@ Partition[Flatten[m, 1], 24], 1]

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

initialArrangement = RandomSample[Range[48]]; 
m = 
 MapThread[
    List, 
    {
       Table[initialArrangement, {4}], 
       Table[RandomSample[{1, 2, 3, 4}], {48}]\[Transpose]
    }, 2
 ]

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


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

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

和第二部分:

(RandomSample /@ m~Flatten~1~Partition~24)~Flatten~1

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

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

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

答案 1 :(得分:3)

也许:

a = RandomSample@Range@48;
Flatten[Array[Partition[Riffle[a, #1], 2] &, 4], 1]

答案 2 :(得分:2)

按照Belisarius的方式,我宁愿这样写:

RandomSample[Flatten[Table[{j, i}, {j, Range[48]}, {i, Range[4]}], 1]]

答案 3 :(得分:2)

这是生成原始数组的侧边栏。

这种形式不必要地长:

Table[{j, i}, {j, Range[48]}, {i, Range[4]}]

你可以简单地写一下:

Table[{j, i}, {j, 48}, {i, 4}]

你也可以使用Array:

List ~Array~ {48, 4}

或者,如果您希望加入子列表:

Tuples@Range@{48, 4}