【问题标题】:Matlab: Random Number depending on anotherMatlab:随机数取决于另一个
【发布时间】:2017-05-16 17:25:56
【问题描述】:

我的 Matlab 代码需要您的帮助...

我想在循环中设置一个随机数(0 到 1 之间):

 for i=1:20
m1(i)= rand;

第二个随机数(n1(i) 应根据第一个最大值设置大于/小于 0.2,但至少大于/小于 m1(i) 0.1,没有负值。

所以最后我想要两个数字在 0 和 1 之间的向量,但是 m1 中的元素 1 和 n1 中的元素 1 不应该相差太大,但也不能太接近另一个...

非常感谢您的提示,我不明白...

【问题讨论】:

    标签: matlab random dependencies intervals


    【解决方案1】:

    这应该可行

    for i=1:20
        m1(i)=rand;
        a=.2;% desired range
        n1(i) = (m1(i)-a).*rand(1,1) + m1(i)/2; % creating the second random vector 
      end
    

    【讨论】:

    • 关闭,但n1-.2 < m1 && n1-.1 > m1不满意
    • 好吧,谢谢你们,但这不起作用......有例如0.96xx 和 0.5xx .. 还有其他想法吗?我真的很困惑..
    • 现在我想起来了,在某些情况下你永远找不到 n1。例如,如果 m1=.99,则不可能找到满足条件的 n1。 m1=.001 也是如此。我认为原始问题需要修改。
    • 如果 m1 == .99,n1 可以在 [.79,.89] 之间。它与 m 的分布不同(n 的尾部会更小),但它是一个随机数。
    【解决方案2】:
    N = 100;
    m = rand(N,1); %random numbers in [0 1]
    n1 = rand(N,1); %random numbers in [0 1]
    %now we want to change the range of n from [0 1] to [m+0.1 m+0.2]
    n1 = n1*0.1; %random numbers in [0 0.1]
    n1 = n1+m+0.1; %random numbers in [m+0.1 m+0.2]
    
    %to get a range [m-0.2 m-0.1]
    n2 = rand(N,1); %random numbers in [0 1]
    n2 = n2*0.1; %random numbers in [0 0.1]
    n2 = n2-0.2+m; 
    
    %but if n2 is negative we should have n1
    n2(n2<0) = n1(n2<0);
    
    %random put half the indexes as n1
    [~,idx] = sort(rand(N,1));
    n2(idx(1:floor(N/2)))=n1(idx(1:floor(N/2)));
    

    n2 是你的向量。

    【讨论】:

      【解决方案3】:

      尝试了几个解决方案,这是我想出的第一个完整解决方案。符合以下所有约束

      • .1 &lt; |m-n| &lt; .2
      • 0 &lt; m &lt; 1
      • 0 &lt; n &lt; 1

      我的 while 循环效率不高,它比将 n(i) 约束为 [0,1] 更简洁、更容易实现;它还保持随机分布。请注意,0 &lt; n &lt; 1 约束将使n 相对于m 向0.5 倾斜

      ub = .2;
      lb = .1;
      
      for i = 1:1000
        m(i) = rand;
      
      
        n(i) = -1;
        % Determine n with [0,1] constraints
        while(n(i)<0 || n(i)>1)    
          n(i) = 2*(ub-lb)*rand + m(i)-(ub-lb);     % Determine the upper bound shell
          n(i) = n(i) + sign(n(i)-m(i))*lb;      % Add the lower bound
        end
        y(i) = m(i) - n(i);                    % Check the difference
      
      end
      
      
      figure;
      hist(y,100);
      

      【讨论】:

        【解决方案4】:

        这是一个线性化的解决方案:

        len = 10000;                  %length of your vector
        m1  = rand(len,1);            %input vector
        g = (randi([0,1],len,1)*2-1); %random [-1 or 1] generator
        a = 0.1.*m1.*g+m1;            %use a = 0.1.*g+m1 for an absolute [0.1,0.2] interval
        b = 0.2.*m1.*g+m1;            %use b = 0.2.*g+m1 for an absolute [0.1,0.2] interval
        n1 = a + (b-a).*rand(len,1);  %output vector
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-02
          • 2014-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-27
          • 2020-06-29
          • 1970-01-01
          相关资源
          最近更新 更多