首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用约束对列表进行混洗

使用约束对列表进行混洗
EN

Stack Overflow用户
提问于 2011-11-20 01:45:24
回答 4查看 336关注 0票数 5

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

请考虑:

代码语言:javascript
复制
Table[{j, i}, {j, Range[48]}, {i, Range[4]}]

其中j是原始刺激数,i是条件

输出示例:

代码语言:javascript
复制
 {{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的距离,即原始刺激数量?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-20 07:26:16

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

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

代码语言:javascript
复制
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)。

平均距离现在变为:

代码语言:javascript
复制
{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

现在,生成刺激条件组合的代码如下:

首先,对所有刺激条件进行随机化:

代码语言:javascript
复制
m = MapThread[
       List, 
       {
         Table[Range[48], {4}], 
         Table[RandomSample[{1, 2, 3, 4}], {48}]\[Transpose]
       }, 2
    ]

然后,分成24人一组,洗牌,并排列成一个列表:

代码语言:javascript
复制
Flatten[RandomSample /@ Partition[Flatten[m, 1], 24], 1]

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

代码语言:javascript
复制
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,中缀表示法版本表明我真的在尝试;-)

代码语言:javascript
复制
m~Set~MapThread[List, (Range[48]~Table~{4}~
    List~((RandomSample[{1, 2, 3, 4}]~Table~ {48})\[Transpose])), 2]

第二部分:

代码语言:javascript
复制
(RandomSample /@ m~Flatten~1~Partition~24)~Flatten~1

第一部分的变体,类似于上面:

代码语言:javascript
复制
initialArrangement~Set~RandomSample[Range[48]]; 
m~Set~MapThread[List, (initialArrangement~Table~{4}~
    List~((RandomSample[{1, 2, 3, 4}]~Table~ {48})\[Transpose])), 2]

顺便说一句,忘记第二部分中的括号,输出虽然看起来很相似,但却是完全错误的。

票数 9
EN

Stack Overflow用户

发布于 2011-11-20 02:57:49

也许:

代码语言:javascript
复制
a = RandomSample@Range@48;
Flatten[Array[Partition[Riffle[a, #1], 2] &, 4], 1]
票数 3
EN

Stack Overflow用户

发布于 2011-11-20 03:07:30

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

代码语言:javascript
复制
RandomSample[Flatten[Table[{j, i}, {j, Range[48]}, {i, Range[4]}], 1]]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8195969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档