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