对于实验,我需要伪随机化100个刺激类别试验的载体,其中80%是A类,10%B和10%C.B试验在每个试验之间至少有两个非B试验另外,C试验必须在两次A试验后进行,然后进行两次A试验。
起初我尝试构建一个脚本,随机化一个向量,然后“弹出”那些不应该在那里的试验,然后将它们放在载体的空间中,那里有一系列A试验。我担心这会过于复杂,并会产生一系列无法预料的错误,需要调试,而且不够随意。
之后我尝试构建一个脚本,它简单地将向量混洗,直到达到标准,这似乎需要更少的代码。但是现在我已经花了几个小时的时间,我想知道这些标准是否对此没有太严格意义,这意味着在实际符合标准之前,向量需要进行洗牌。
您认为处理此问题的最简单方法是什么?另外,这是最好的随机播放功能,因为在心理工具箱中的Shuffle似乎无法正常工作?
答案 0 :(得分:0)
这个问题的范围远远超出特定于语言的结构,并且涉及对概率和排列/组合的良好理解。
解决这个问题的方法是:
由于类别A
没有施加约束,我们将转到下一个类别。
类别C
的唯一约束是它必须在前后有两个A
。因此,我们首先创建5个向量的随机组,模式为A A C A A
。
此时,我们有一组A
向量(不包括块),A A C A A
向量块和B
向量。
B
上的约束是两个连续的B
必须在它们之间至少有2个非B
个向量。
可视化如下:让我们在一个数组A
中汇集A A C A A
和X
。让我们将所有B
放在一行(假设有3 B
s):
s0 B s1 B s2 B s3
其中s
是每个B
之间的向量数。因此,我们要求s1
,s2
至少为2,整体s0 + s1 + s2 + s3
等于X
中的向量数。
然后,任务是从X中选择随机向量并将它们分配给每个s
。最后,我们最终得到一个随机向量,所有类别都被洗牌,满足约束条件。
P.S。这可以映射到查找一组随机数的经典问题,这些随机数与约束相加。
将约束和问题减少到没有约束的问题更容易。这可以这样做:
s0 B s1 t1 B s2 t2 B s3
从t1
中选择t2
和X
只是为了满足B
的约束,而s0 + s1 + s2 + s3
等于X中的向量数量而不是{{1} }}
在MATLAB中实现相同可以从使用单元格数组中受益,并且this algorithm用于常数和的随机数。
您还需要为每个类别维护单独的池,并保留构建块并将它们组合在一起。
真的,这不是微不足道的,但也不是不可能的。这是您可以尝试的方法,如果您想要像之前尝试的那样退出强力搜索。