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

MATLAB中刺激类别间最小间隔的伪随机化,matlab,vector,random,shuffle,Matlab,Vector,Random,Shuffle,对于一个实验,我需要对100个刺激类别的试验向量进行伪随机,其中80%为a类、10%B类和10%C类。B类试验之间至少有两个非B类试验,C类试验必须在两个a类试验之后进行,并在其后进行两个a类试验 起初,我尝试构建一个脚本,随机分配一个向量,然后“弹出”出不应该出现的试验,并将它们放在向量中有一长串试验的空间中。但我担心这过于复杂,会产生一系列需要调试的不可预见的错误,而且随机性不够 之后,我尝试构建一个脚本,该脚本简单地洗牌向量,直到它达到标准,这似乎需要更少的代码。然而,现在我已经花了几个小

对于一个实验,我需要对100个刺激类别的试验向量进行伪随机,其中80%为a类、10%B类和10%C类。B类试验之间至少有两个非B类试验,C类试验必须在两个a类试验之后进行,并在其后进行两个a类试验

起初,我尝试构建一个脚本,随机分配一个向量,然后“弹出”出不应该出现的试验,并将它们放在向量中有一长串试验的空间中。但我担心这过于复杂,会产生一系列需要调试的不可预见的错误,而且随机性不够

之后,我尝试构建一个脚本,该脚本简单地洗牌向量,直到它达到标准,这似乎需要更少的代码。然而,现在我已经花了几个小时在它上面,我想知道这些标准是否太严格了,这就没有意义了,这意味着向量在真正满足标准之前需要永远洗牌


你认为处理这个问题最简单的方法是什么?此外,由于psychtoolbox中的shuffle似乎无法正常工作,因此使用哪种洗牌函数最好?

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

解决这个问题的方法是:

  • 创建向量块,使每个块独立放置在任何位置
  • 随机分配这些块以获得满足所有约束的最终随机向量
  • 第0部分:A类 由于category
    A
    没有对其施加任何约束,因此我们将转到下一个类别

    第1部分:使C类独立 类别
    C
    的唯一限制是它必须在前后有两个
    A
    。因此,我们首先创建5个向量的随机组,模式为
    aa

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

    第2部分:解决B的放置问题
    B
    的约束条件是两个连续的
    B
    s之间必须至少有两个非
    B
    向量

    可视化如下:让我们将
    A
    A A A C A
    集中在一个数组中,
    X
    。让我们将所有
    B
    s排成一行(假设有3个
    B
    s):
    s0bs1bs2bs3

    其中
    s
    是每个
    B
    之间的向量数。因此,我们要求
    s1
    s2
    至少为2,并且总体
    s0+s1+s2+s3
    等于
    X
    中的向量数

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

    另一方面,这可以映射到一个经典问题,即寻找一组随机数,这些随机数加起来等于一个特定的总和,并带有约束条件。 将约束和问题简化为无约束问题更容易。这可以通过以下方式完成:
    s0 B s1 t1 B s2 t2 B s3

    其中,
    t1
    t2
    X
    中选择,刚好满足
    B
    上的约束,并且
    s0+s1+s2+s3
    等于X中不在
    t
    中的向量数

    实施 在MATLAB中实现同样的功能可以从使用单元阵列和常数和的随机数中获益

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


    真的,这不是小事,也不是不可能。如果你想像以前一样放弃暴力搜索,这就是你可以尝试的方法。

    真实数字?整数?什么是“3空间”?我的意思是向量上的索引,所以如果向量(8)是C类刺激,下一个可以是C类的索引就是向量(11)。中间必须有两次A测试。我正在更新原始帖子以反映这一点。你能解释一下你对“伪随机”的要求吗?由于每一类的试验数量不同,随机试验也将包含更多的“A”而不是“B”和“C”。可以吗?是的,它应该包含每个类别的相同比例,只是随机的。我不完全清楚为什么给我“伪随机化”这个词,但根据我的理解,你可以用“随机化”这个词来代替。我想这只是说,任何不产生真正随机数(或随机数)的函数都足够了。@Damon如果您有任何疑问,请告诉我。我希望您能够自己尝试一个实现——也许将来我有空的时候,我可以自己编写代码。谢谢,这非常有帮助。我相信我理解这个想法,但我对一些术语有点理解。为了简单起见,假设条件B和C是相同的,它们的向量应该分别像[A A A]和[A A C A]。这是否意味着我应该从一个更大的向量[a a[a B a a][a B a][a a a B a][a a a C a]开始,然后随机组合元素?是的,没错。因此在这种情况下,[A A[A B A A][A B A][A A A B A][A A A C A][A A A A C A][A A A A A]应该被随机洗牌(可以在MATLAB中使用),然后这些块应该被“合并”最后,这样你就有了[A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A,把它们都放在一个池子里,就像你上面提到的。