Wolfram mathematica 用约束洗牌列表

Wolfram mathematica 用约束洗牌列表,wolfram-mathematica,random-sample,Wolfram Mathematica,Random Sample,准备一个新的心理物理实验, 我有48个原始刺激显示4次(4种条件),结果是192次试验。 尝试在实验过程中随机排列呈现顺序, 我需要最大化相同原始刺激的4个显示之间的距离 请考虑: Table[{j, i}, {j, Range[48]}, {i, Range[4]}] 其中j为原始刺激数,i为条件 输出样本: {{1, 1}, {1, 2}, {1, 3}, {1, 4}, {2, 1}, {2, 2}, {2, 3}, {2, 4}, ... {47, 1}, {47

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

请考虑:

Table[{j, i}, {j, Range[48]}, {i, Range[4]}]
其中j为原始刺激数,i为条件

输出样本:

 {{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的距离?

也许:

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

按照贝里萨里乌斯的方式,我宁愿这样写:

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

你必须在随机性和原始刺激之间最大距离的限制之间进行折衷。当您将刺激物安排在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(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]]
)放在
表中是非常错误的


对于Wizard先生,这里的中缀符号版本表明我确实在尝试;-)

第二部分:

(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]

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

这是一个关于生成原始数组的边栏

此表单不必要地长:

Table[{j, i}, {j, Range[48]}, {i, Range[4]}]
你可以简单地写:

Table[{j, i}, {j, 48}, {i, 4}]
您还可以使用数组:

List ~Array~ {48, 4}
或者,如果要加入子列表:

Tuples@Range@{48, 4}

我很难理解你想要什么。。。你能发布一个样本输出吗?@Yoda让
s假设我4次显示48幅图像,结果是192次试验。我想显示相同的图像,中间的图像差异最大。如果我只有3张图片重复4次。我猜是{1,2,3,1,2,3,1,2,3}?实际上,谢谢你,我想我们不能做得比这更好吗?所以我的例子是这样的:{Range[48],Range[48],Range[48],Range[48]}?虽然我不会给出一个相互竞争的答案,但让我向你介绍一下你所问问题的术语。您想要的是在样本分布中引入某种程度的“相关性”。一个完全随机化的集合不会显示图像位置之间的相关性,但是添加最大间距的约束会如您在列表中所指出的那样
{1,2,3,1,2,3…}
。在某种意义上,这通过减少允许的配置数量来降低样本集中的随机性(熵)。例如,您的
{1,2,3}
列表中只有3个配置可用。@rcollyer,感谢您的澄清!谢谢你,你能在这里解释一下Riffle的用法吗?@500 Riffle是用来为每个样本添加迭代数{{,1}…{,4},根据你的要求谢谢,我觉得这一个现在会出现在我的词汇表中:-)这个洗牌,但我不知道约束是如何施加的-或者可能是怎样的。可能需要某种加权方案,因此如果
{23,1}
接近1的末尾,
{23,2}
不应该接近其组的开头。但在极限状态下,四轮中的每一轮都会有相同的顺序。您需要指定同一图像两次出现之间的最小可接受距离,以避免出现这种情况。@Verbeia我本以为和您一样,但在阅读了500在他的问题下的评论后,我改变了主意。非常感谢:这个:List~Array~{48,4}对我来说非常优雅,但我不明白它的工作方式。你能解释一下我们什么时候,什么时候不能用这个语法吗?@500我会尽量解释的。中缀(a~function~b)表示法可以在一个函数正好有两个参数时使用,并且两个参数的组合比中缀表示法本身具有更大的约束力。因此,我们可以编写
17~Mod~5
来代替
Mod[17,5]
,但我们不能编写
10+7~Mod~5
,因为中缀在
Plus
之前绑定,因此它的内容是
10+(7~Mod~5)
。查看本页了解更多信息:看,妈妈,没有手:
i~List~j~表~(i~List~48)~表~(j~List~4)
:D@mr.wizardbelisarius提供了一个很好的例子,说明了我不喜欢中缀符号的原因。读这本书几乎是一场智力游戏。正如您在上面正确地注意到的,您必须牢记优先级表()才能成功地使用它。当然,@和/@也是如此,但记住的越少越好。在~离三个键盘远的时候讨论中缀(就像在iPad上一样)一点也不好玩。@Wizar先生
Tuples@Range@{48, 4}