MATLAB中的伪随机化,刺激类别之间的间隔最小

时间:2017-08-08 08:42:00

标签: matlab vector random shuffle

对于实验,我需要伪随机化100个刺激类别试验的载体,其中80%是A类,10%B和10%C.B试验在每个试验之间至少有两个非B试验另外,C试验必须在两次A试验后进行,然后进行两次A试验。

起初我尝试构建一个脚本,随机化一个向量,然后“弹出”那些不应该在那里的试验,然后将它们放在载体的空间中,那里有一系列A试验。我担心这会过于复杂,并会产生一系列无法​​预料的错误,需要调试,而且不够随意。

之后我尝试构建一个脚本,它简单地将向量混洗,直到达到标准,这似乎需要更少的代码。但是现在我已经花了几个小时的时间,我想知道这些标准是否对此没有太严格意义,这意味着在实际符合标准之前,向量需要进行洗牌。

您认为处理此问题的最简单方法是什么?另外,这是最好的随机播放功能,因为在心理工具箱中的Shuffle似乎无法正常工作?

1 个答案:

答案 0 :(得分:0)

这个问题的范围远远超出特定于语言的结构,并且涉及对概率和排列/组合的良好理解。

解决这个问题的方法是:

  1. 创建向量块,使每个块独立于任何位置。
  2. 随机分配这些块以获得满足所有约束的最终随机向量。
  3. 第0部分:A类

    由于类别A没有施加约束,我们将转到下一个类别。

    第1部分:使C类独立

    类别C的唯一约束是它必须在前后有两个A。因此,我们首先创建5个向量的随机组,模式为A A C A A

    此时,我们有一组A向量(不包括块),A A C A A向量块和B向量。

    第2部分:解决B

    的位置问题

    B上的约束是两个连续的B必须在它们之间至少有2个非B个向量。

    可视化如下:让我们在一个数组A中汇集A A C A AX。让我们将所有B放在一行(假设有3 B s):
    s0 B s1 B s2 B s3
    其中s是每个B之间的向量数。因此,我们要求s1s2至少为2,整体s0 + s1 + s2 + s3等于X中的向量数。

    然后,任务是从X中选择随机向量并将它们分配给每个s。最后,我们最终得到一个随机向量,所有类别都被洗牌,满足约束条件。

    P.S。这可以映射到查找一组随机数的经典问题,这些随机数与约束相加。 将约束和问题减少到没有约束的问题更容易。这可以这样做:
    s0 B s1 t1 B s2 t2 B s3
    t1中选择t2X只是为了满足B的约束,而s0 + s1 + s2 + s3等于X中的向量数量而不是{{1} }}

    实施

    在MATLAB中实现相同可以从使用单元格数组中受益,并且this algorithm用于常数和的随机数。

    您还需要为每个类别维护单独的池,并保留构建块并将它们组合在一起。

    真的,这不是微不足道的,但也不是不可能的。这是您可以尝试的方法,如果您想要像之前尝试的那样退出强力搜索