首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新排列一个数字列表,使每个N个数字都不重复?

如何重新排列一个数字列表,使每个N个数字都不重复?
EN

Stack Overflow用户
提问于 2014-02-04 11:12:20
回答 4查看 166关注 0票数 0

所以我有一个190个数字的列表,范围从1:19 (每个数字重复10次),我需要一次采样10个。在每个10个样本中,我不希望数字重复,我尝试合并一个while循环,但计算时间太长。到目前为止,我可以生成数字,并查看每个子集内是否有重复。有什么想法吗?

代码语言:javascript
复制
        N=[];
        for i=1:10
            N=[N randperm(19)];
        end
        B=[];
        for j=1:10
            if length(unique(N(j*10-9:j*10)))<10
               B=[B 1];
            end
        end
        sum(B)

下面是代码的更新版本。这可能会更清楚地显示我想要什么。(19个目标一次10次,不重复,直到所有19个目标重复10次)

代码语言:javascript
复制
nTargs = 19;
pairs = nchoosek(1:nTargs, 10);
nPairs = size(pairs, 1);
order = randperm(nPairs);
values=randsample(order,19);
targs=pairs(values,:);
Alltargs=false;
while ~Alltargs
    targs=pairs(randsample(order,19),:);
    B=[];
    for i=1:19
    G=length(find(targs==i))==10;
    B=[B G];
    end
    if sum(B)==19
        Alltargs=true;
    end
end
EN

回答 4

Stack Overflow用户

发布于 2014-02-04 19:14:57

这里有一些非常简单的步骤,基本上你只需将向量洗牌一次,然后获取最后10个唯一的值:

代码语言:javascript
复制
v = repmat(1:19,1,10);

v = v(randperm(numel(v)));

[a idx]=unique(v);
result = unique(v);
v(idx)=[];

这个算法应该是相当有效的,如果你想做下10个,只需再次运行最后一部分,并将result组合成一个totalResult

票数 2
EN

Stack Overflow用户

发布于 2014-02-04 18:08:30

你想随机抽取数字1:19,每组10个,不重复。Matlab函数'randsample‘有一个可选的'replacement’参数,如果你不想重复,你可以设置为'false‘。例如:

代码语言:javascript
复制
N = [];
replacement = false; 
for i = 1:19
N = [N randsample(19,10,replacement)];
end

这将生成一个范围为1,..,19的19×10随机整数矩阵,每列中没有重复。

编辑:这里是一个解决方案,它满足了每个整数1,..,19恰好出现10次的要求,并且在每个列/样本中没有重复:

代码语言:javascript
复制
nRange = 19; nRep = 10; 
valueRep = true; % true while there are repetitions 
nLoops = 0; % count the number of iterations
while valueRep
    l   = zeros(1,nRep); 
    v = []; 
    for m = 1:nRep
    v  = [v, randperm(nRange,nRange)]; 
    end
    m1  = reshape(v,nRep,nRange); 
    for n = 1:nRep
     l(n) = length(unique(m1(:,n))); 
    end
    if all(l == nRep)
    valueRep = false; 
    end
nLoops = nLoops + 1; 
end
result = m1; 

对于问题中的参数,大约需要300次迭代才能找到结果。

票数 1
EN

Stack Overflow用户

发布于 2014-02-04 18:28:59

我认为你应该以建设性的方式来处理这个问题。

通过重新排列系列1: 19 : happy和rearranged= reshape(series1,10,19)

  • then
  1. series1 = repmat(1:19,1,10);
    1. 我会选择两个随机列,复制它们并在两个随机位置交换值,然后测试它是否满足您的条件-例如:
    2. -如果满足,请替换您的列test = @(x) numel(unique(x))==10 <

    >H112,继续混洗,直到您的时间用完或您处于随机状态

当然,您可能会想出更有效的混洗或测试

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21542288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档