【问题标题】:Matlab: Array of random integers with no direct repetitionMatlab:没有直接重复的随机整数数组
【发布时间】:2015-01-06 19:00:27
【问题描述】:

对于我的实验,我有 20 个类别,每个类别包含 9 张图片。我想以伪随机序列显示这些图片,其中对随机性的唯一限制是一个图像可能不会直接跟随同一类别的一个图像。 所以我需要类似的东西

r = randi([1 20],1,180);

只是添加了两个不直接相互跟随的数字的约束。例如

14 8 15 15 7 16 6 4 1 8 不合法,而

14 8 15 7 15 16 6 4 1 8 会。

我想到的另一种方法是将类别命名为 A、B、C、...T,让它们重复 9 次,然后将它们随机排列。但是我认为你遇到了同样的问题吗? 我是一个绝对的 Matlab 初学者,因此欢迎任何指导。

【问题讨论】:

    标签: matlab random replace shuffle sampling


    【解决方案1】:

    以下使用模运算来确保每个值都与前一个不同:

    m = 20; %// number of categories
    n = 180; %// desired number of samples
    x = [randi(m)-1 randi(m-1, [1 n-1])];
    x = mod(cumsum(x), m) + 1;
    

    代码的工作原理

    • 在第三行中,x 的第一个条目是0m-1 之间的随机。每个后续条目都表示 更改,以 m 为模,将给出下一个值(这在第四行中完成)。
    • 关键是选择1m-1 之间的变化(而不是0m-1),以确保连续的值会不同。换句话说,给定一个值,下一个值有m-1(不是m)选择。
    • 在模运算之后,将1 添加到以将结果值的范围从0,...,m-1 转换为1,...,m

    测试

    在生成的x 向量中获取所有 (n-1) 对连续条目并计算所有 (m^2) 可能的值组合的出现次数:

    count = accumarray([x(1:end-1); x(2:end)].', 1, [m m]);
    imagesc(count)
    axis square
    colorbar
    

    以下图片已为m=20; n=1e6; 获取。可以看出,所有组合的可能性(或多或少)均等,但具有重复值的对除外,这种情况永远不会发生。

    【讨论】:

    • +1 我只是根据这个写一个答案。你的比我的要干净。
    • 不完全确定理论,但与hist 核对过,这些值确实是随机的!在我看来是合法的。
    • 是的,这有点令人困惑:-) 试想第三行中x 的每个条目都是将添加到上一个条目以获得当前值的术语。这些值最后以 m 为模减少到所需的间隔
    • 哇!对于这个问题,这是一个非常有趣且有用的图表!酷!!希望我有更多的 +1 给这个!
    【解决方案2】:

    您可以以迭代的方式查找重复项,并将来自同一组[1 20] 的新整数集仅放入发生重复的地方。我们继续这样做,直到没有重复 -

    interval = [1 20]; %// interval from where the random integers are to be chosen
    r = randi(interval,1,180); %// create the first batch of numbers
    
    idx = diff(r)==0; %// logical array, where 1s denote repetitions for first batch
    while nnz(idx)~=0
        idx = diff(r)==0; %// logical array, where 1s denote repetitions for
                          %// subsequent batches
        rN = randi(interval,1,nnz(idx)); %// new set of random integers to be placed
                                 %// at the positions where repetitions have occured
        r(find(idx)+1) = rN; %// place ramdom integers at their respective positions
    end
    

    【讨论】:

    • +1 你的拒绝方法比我的更清楚,虽然它的运行时间是随机的并且可能更大
    • @LuisMendo 是的,如果我能做一个,我会选择一个无循环的解决方案!:)
    • 我添加了一些测试代码。当然,根据该测试,您的解决方案同样有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2019-08-09
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多