所以我有一个190个数字的列表,范围从1:19 (每个数字重复10次),我需要一次采样10个。在每个10个样本中,我不希望数字重复,我尝试合并一个while循环,但计算时间太长。到目前为止,我可以生成数字,并查看每个子集内是否有重复。有什么想法吗?
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次)
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发布于 2014-02-04 19:14:57
这里有一些非常简单的步骤,基本上你只需将向量洗牌一次,然后获取最后10个唯一的值:
v = repmat(1:19,1,10);
v = v(randperm(numel(v)));
[a idx]=unique(v);
result = unique(v);
v(idx)=[];这个算法应该是相当有效的,如果你想做下10个,只需再次运行最后一部分,并将result组合成一个totalResult
发布于 2014-02-04 18:08:30
你想随机抽取数字1:19,每组10个,不重复。Matlab函数'randsample‘有一个可选的'replacement’参数,如果你不想重复,你可以设置为'false‘。例如:
N = [];
replacement = false;
for i = 1:19
N = [N randsample(19,10,replacement)];
end这将生成一个范围为1,..,19的19×10随机整数矩阵,每列中没有重复。
编辑:这里是一个解决方案,它满足了每个整数1,..,19恰好出现10次的要求,并且在每个列/样本中没有重复:
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次迭代才能找到结果。
发布于 2014-02-04 18:28:59
我认为你应该以建设性的方式来处理这个问题。
通过重新排列系列1: 19 : happy和rearranged= reshape(series1,10,19)
series1 = repmat(1:19,1,10); test = @(x) numel(unique(x))==10 <>H112,继续混洗,直到您的时间用完或您处于随机状态
当然,您可能会想出更有效的混洗或测试
https://stackoverflow.com/questions/21542288
复制相似问题