Как писал 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
, чтобы выбрать только положительные значения.