使用Matlab,如何从一组200个数字{1,2,3,...,n,n + 1,...,200}生成10000个随机序列的20个数字,条件如下: 对于每个系列的两个数字x和y,abs(x-y)/ 50不同于0,1,2和3.
例如: 如果57是一个系列的一部分,我不想拥有这个系列:7或其他57或107或157
答案 0 :(得分:1)
这可以分两步完成:
第一步可以使用randperm
,第二步可以使用randi
,因此可以生成一行;
row = randperm(50,20)+(randi(4,1,20)-1)*50
遗憾的是randperm
无法直接用于生成所需的10000行
可以使用一个简单的循环来生成10000系列;
n=10000;
data=zeros(20,n);
for ii=1:n
data(:,ii) = randperm(50,20)+(randi(4,1,20)-1)*50;
end
对于0-50,51-100,101-150和151-200范围内的概率prob=[p1;p2;p2;p4]
的列向量(将用于上面的第二个决策)
(randi(4,1,20)-1)
字词可以替换为sum(bsxfun(@ge,rand(1,20),p))
,其中p定义如下......
可以按如下方式实施
p = cumsum(prob) % last entry of p should =1
row = randperm(50,20)+sum(bsxfun(@ge,rand(1,20),p))*50
也可以简单地放在循环中以生成10000系列
答案 1 :(得分:1)
如果要从总体中绘制随机样本,可以使用randsample
并指定加权概率。您可以做的是以下(一次迭代):
因此,这里是10000次迭代的代码(最外面的for
循环)。最里面的for
循环执行上面的算法。
randomNumbers = zeros(10000, 20);
for i = 1 : 10000
seq = 1 : 200; %// Step #1
probs = (1/200)*ones(1,200); %// Step #2
for j = 1 : 20
%// Generate number according to condition
%// Step #3a
num = randsample(200, 1, true, probs);
%// Store number
randomNumbers(i,j) = num;
%// Generate numbers that should not
%// appear in the next iteration / sampling
seq2 = 1 : 200;
seq3 = abs(seq2 - num) / 50;
flags = seq3 == 0 | seq3 == 1 | seq3 == 2 | seq3 == 3;
numbersToDiscard = seq2(flags);
%//Figure out how many numbers are left that
%//we can generate
seq(numbersToDiscard) = 0;
totalLeft = sum(seq ~= 0);
%// Calculate new probabilities for generation
probs = (1/totalLeft)*ones(1,200); %//Step #3b and #3c
probs(seq == 0) = 0;
end
end
randomNumbers
将是您随机生成的序列。每行包含一个基于上述规则的20个样本序列,总共有10000个序列。
NB:我刚在计算机上运行此代码。它是Intel i7-4770 CPU @ 3.40 GHz,在Windows 7旗舰版上运行16 GB RAM,运行MATLAB R2014a。这花了大约6.27秒。这可能是因为我在每次迭代时生成一个数字并重新计算即时绘制的概率。这需要一些时间,所以我希望你耐心等待!