如何使用matlab生成具有特定条件的1到200的随机数系列?

时间:2014-05-31 07:40:15

标签: matlab

使用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

2 个答案:

答案 0 :(得分:1)

这可以分两步完成:

  • 首先生成20到1到50之间的唯一数字
  • 第二个决定他们属于哪个地区(0-50,51-100,101-150,151-200)

第一步可以使用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并指定加权概率。您可以做的是以下(一次迭代):

  1. 从1到200
  2. 的序列开始
  3. 开始一个循环,然后从PDF开始,使每个数字等于画出等等。
  4. 对于循环中的每次迭代......
    • 画一个数字
    • 将满足条件的数字的概率设置为零。
    • 重新分配概率,以便使其余部分具有等概率
  5. 重复3直到我们达到20次
  6. 因此,这里是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秒。这可能是因为我在每次迭代时生成一个数字并重新计算即时绘制的概率。这需要一些时间,所以我希望你耐心等待!