Генерация случайных чисел в определенном диапазоне - PullRequest
2 голосов
/ 24 января 2012

Я хочу сгенерировать случайные числа Гаусса в MATLAB для длинной программы, которая выполняется для большого числа итераций.Я использовал функцию randn, но есть ли способ избежать отрицательных результатов и генерировать случайные числа в диапазоне от 1 до 100.

Например

X = 0.02 * randn;

Как я могу получить только положительные значения в определенном диапазоне.

Ответы [ 3 ]

4 голосов
/ 24 января 2012

Как писал Cheery, гауссовский дистрибутив охватывает весь реальный набор, поэтому невозможно иметь числа, как нормально распределенные, так и ограниченные в поддержке.

Решением может быть усечение значений: восстановить значения, когда randn возвращает значение вне желаемого диапазона.

Это может быть реализовано довольно легко (и наивно) с помощью следующего кода:

function x = randnlimit(mu, sigma, minVal, maxVal, varargin);

assert(mu>=minVal && mu<=maxVal);
assert(sigma>0);

x = mu + sigma*randn(varargin{:});
outsideRange = x<minVal | x>maxVal;
while nnz(outsideRange)>0
   x(outsideRange) = mu + sigma*randn(nnz(outsideRange),1);
   outsideRange = x<minVal | x>maxVal;
end

изменить , чтобы подвести итоги обсуждения @Cheery и у меня было: Вы можете выбрать: либо вы получите гауссову, но затем вы застряли со значениями, которые покрывают всю действительную ось (так же как и отрицательные значения). С другой стороны, если вам нужен ограниченный диапазон, вам нужно использовать другой дистрибутив для генерации выборок из.

Какой подход вам нужен, зависит от вашего приложения. Является ли необходимость в ограниченной поддержке изначальной или форма pdf является наиболее важной.

Код, который я предоставил выше, будет ограничен диапазоном [minVal, maxVal] и приблизительно гауссовским, если вы выберете sigma и mu соответственно, то есть mu = maxVal/2 + minVal/2 и n * sigma = maxVal - minVal. При значении n, превышающем два, распределение будет довольно близко к реальному гауссову. Например. для n=2 я ожидаю разницу только в 5% (для n=3 менее 1%). Конечно, вы можете указать minVal = 0 и maxVal = +Inf, чтобы выбрать только положительные значения.

0 голосов
/ 12 сентября 2013

Вы должны выбрать ограниченное распределение поддержки, которое имеет желаемые свойства, отметьте http://en.wikipedia.org/wiki/List_of_probability_distributions. У меня похожая проблема. Я хочу применить модель конечных смесей к ограниченному распределению поддержки, к сожалению, большинство алгоритмов фокусируются на Гауссовские распределения.

0 голосов
/ 24 января 2012

Гауссово распределение по определению имеет распределение (-inf, inf). Стандартное отклонение (сигма) по умолчанию равно 1. Если вы ищете равномерное распределение по [1, 100] используйте 99 * rand () + 1 или randi ([1 100]) для целых чисел.

пс: для гауссовского распределения с диапазоном есть решение (путем установки сигмы и сдвига максимума распределения) http://www.mathworks.com/matlabcentral/newsreader/view_thread/156521

function X=random_generator(n, x_max, x_min)
    X=[x_min+((randn(n,n)).*(x_max-x_min))];
end

x_min здесь не минимальное значение - это среднее значение (или пик распределения). Распределение симметрично относительно x_min. Но отрицательные значения не будут удалены как распределение, определенное по всей оси X. Вероятность их будет меньше.

pps: из руководства Матлаба

Генерация значений из нормального распределения со средним 1 и стандартным отклонение 2: 1 + 2. * randn (100,1);

...