代码之家  ›  专栏  ›  技术社区  ›  hello123

使用随机对生成单元,无需重复

  •  0
  • hello123  · 技术社区  · 7 年前

    如何生成无重复对的随机对序列? 以下代码已生成配对,但无法避免重复:

    for k=1:8
        Comb=[randi([-15,15]) ; randi([-15,15])];
        T{1,k}=Comb;
    end
    

    T= [-3;10] [5;2] [1;-5] [10;9] [-4;-9] [-5;-9] [3;1] [-3;10]
    

    配对[-3,10]重复,这是不可能发生的。

    PS:条目可以是正数或负数。

    是否有任何内置功能?有什么建议可以解决这个问题吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Luis Mendo    7 年前

    randsample 8 来自的数字 1 31^2 (其中 31 是总体大小),无需替换,然后将每个获得的数字“解包”到一对的两个分量中:

    s = -15:15; % population
    M = 8; % desired number of samples
    N = numel(s); % population size
    y = randsample(N^2, M); % sample without replacement
    result = s([ceil(y/N) mod(y-1, N)+1]); % unpack pair and index into population
    

    result =
        14     1
        -5     7
        13    -8
        15     4
        -6    -7
        -6    15
         2     3
         9     6
    
        2
  •  2
  •   rahnema1    7 年前

    您可以使用 ind2sub :

    n = 15;
    m = 8;
    [x y]=ind2sub([n n],randperm(n*n,m));
    
        3
  •  1
  •   skm    7 年前

    M = nchoosek(1:15, 2);
    T = datasample(M, 8, 'replace', false);
    

    T = zeros(8,2);
    k = 1;
    while (k <= 8)
      t = randi(15, [1,2]);
      b1 = (T(:,1) == t(1));
      b2 = (T(:,2) == t(2));
      if ~any(b1 & b2)
        T(k,:) = t;
        k = k + 1;
      end
    end
    

    第一种方法可能更快,但占用更多内存,并且可能不适用于非常大的数字(例如:如果不是15,最大值为50000),在这种情况下,您必须使用2。