В качестве альтернативы вы можете попытаться извлечь случайные числа из неусеченного дистрибутива и выполнить усечение самостоятельно.
У меня нет набора инструментов статистики, поэтому я буду использовать randn
здесь, чтобырисует случайные числа:
function M = truncated_normal(n)
M = randn(n,1);
I = M < -2 | M > 2;
n = nnz(I);
if n>0
M(I) = truncated_normal(n);
end
Эта функция извлекает n
случайные числа из заданного распределения, затем находит любые значения, которые находятся за пределами выбранного интервала (M < -2 | M > 2
), и выводит новые значения для них с помощьюрекурсивный вызов самого себя.
Функция также может быть записана с циклом while, если вы предпочитаете.Но пока вероятность случайного значения в хвостах мала, требуется очень мало итераций.