2014-01-19 22 views
-1

Я хочу сгенерировать N-мерный вектор-столбец в matlab со средним значением 0.5 (дисперсия в порядке для настройки), но я хочу, чтобы все числа были положительными, кто-нибудь знает, как это сделать?Создать неотрицательное случайное число (matlab)

+0

положительный или неотрицательный? – guness

+1

Прочтите это http://stackoverflow.com/questions/9806158/generate-a-random-number-with-max-min-and-mean-average-in-matlab – herohuyongtao

+1

Вы заботитесь о распределении чисел? – Floris

ответ

0

Это зависит от того, что вы хотите. Функция rand(v) генерирует равномерное случайное распределение (диапазон [0,1] Я считаю, хотя я не уверен, что либо 0, либо 1 теоретически возможные значения) в массиве с размерами v.

Так что, если вы хотите 3x4x5x6 массив, вы могли бы сделать

myRandArray = rand([3 4 5 6]); 

Если вы хотите, верхнее значение будет больше, вы могли бы сделать

myRandArray = maxVal * rand([3 4 5 6]); 

Где maxVal это наибольшее значение. И если вы хотите диапазон minVal в maxVal, а затем сделать

myRandArray = minVal + (maxVal - minVal) * rand([3 4 5 6]); 

Для других распределений (как randn для нормального распределения), вы можете внести изменения в вышеизложенное, очевидно. Если вы хотите «усеченное нормальное распределение» - вам может понадобиться, чтобы начать слишком много значений:

dims = [3 4 5 6]; 
n = prod(dims); 
tooMany = 0.5 + randn(2 * n); % since you want mean = 0.5 
tooMany(tooMany < 0) = []; 
if numel(tooMany) > n 
    myRandArray = reshape(tooMany(1:n), dims); 
end 

Вы можете явно улучшить, но это общая идея.

Например, вы можете сгенерировать только значения n, посмотреть, сколько неудач (скажем m), затем сгенерировать другое m * n/(n - m) и повторить по мере необходимости, пока вы не получите ровно n.

Обратите внимание, что среднее значение окончательного распределения больше не 0.5, так как мы отрезаем хвост. «Нормальное распределение» не может оставаться «нормальным», если вы исключите определенные значения. Но тогда вы не указали, что распределение вы хотите ...

0

Вы можете попробовать это:

Э.Г. создать вектор из 1000 случайных величин, взятых из нормального распределения со средним значением 0,5 и стандартным отклонением 5.

a = 5; 
b = 0.5; 
y = a.*randn(1000,1) + b; 

Чтобы сделать это положительный, то вы можете удалить все номера, которые являются отрицательными или нулевыми и генерировать еще до тех пор, пока вы не получите n положительных чисел.

Отъезд here для получения дополнительной информации.

+0

Взятие 'abs' делает это очень не случайным распределением. Конечно, и снятие отрицательных значений ... но я думаю, что последнее меньше «повреждает» часть распределения, которая составляет> 0 – Floris

+1

@Floris Year, 'abs' - плохой выбор. Обновлено. Благодарю. – herohuyongtao

Смежные вопросы