Matlab: случайное число в зависимости от другого

Мне нужна твоя помощь с моим кодом Matlab...

Я хочу установить случайное число (от 0 до 1) в цикле:

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

и второе случайное число (n1(i) должно быть установлено в зависимости от первого максимума на 0,2 больше / меньше, но по крайней мере на 0,1 больше / меньше, чем m1 (i) без отрицательных значений.

Итак, в конце я хочу два вектора с числами от 0 до 1, но элемент 1 в m1 и элемент 1 в n1 не должны быть слишком разными, но и не слишком близко к другому...

Был бы так благодарен за ваши советы, я не понимаю...

4 ответа

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 - твой вектор.

Вот линеаризованное решение:

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

Это должно работать

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

Пробовал пару решений, и это было первое полное решение, которое я придумал. Подходит для всех следующих ограничений

  • .1 < |m-n| < .2
  • 0 < m < 1
  • 0 < n < 1

Мой цикл while не эффективен, он был чище и проще в реализации, чем ограничение n(i) с помощью [0,1]; это также поддерживает случайное распределение. Просто чтобы вы знали, 0 < n < 1 ограничение будет искажено n к.5 по отношению к m

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);

м-н

Другие вопросы по тегам