Я думаю, что ваша проблема заключается в неправильном понимании нормального распределения. Нормальное распределение дает вам числа в диапазоне (-inf, inf)
. Хотя чем больше абсолютное значение, тем менее вероятным является число (не линейное). Вы можете видеть это на каждой картине нормального распределения. Проще говоря, среднее значение является значением самой высокой вероятности, а стандартное отклонение определяет, насколько пиковой является кривая,
Поскольку вам нужны только значения в [mean, mean + standard dev]
, я рекомендую немного настроить распределение и использовать абсолютное значение случайного числа (по отношению к среднему значению) и вырезать его при стандартном отклонении, рассматривая это значение как значение mean + standart dev
.
public static double NextRandomWithinStandardDeviation(this Gaussian gaussian)
{
return Math.Min(
Math.Abs(gaussian.NextRandom() - gaussian.Mean) + gaussian.Mean,
gaussian.Mean + gaussian.StandardDeviation
);
}
Однако это не будет по-настоящему нормальным распределением. Фактически, 21,73% всех сгенерированных случайных чисел будут вне вашего интервала, что значительно увеличивает вероятность получения mean + standard deviation
.
Другим подходом может быть генерирование случайного числа, пока сгенерированное число не окажется в пределах интервала. Теоретически это может занять вечность, но вероятность получить число вне интервала после пятой итерации составляет менее 0,01%.
public static double NextRandomWithinStandardDeviation(this Gaussian gaussian)
{
double randomNumer;
do
{
randomNumber = Math.Abs(gaussian.NextRandom() - gaussian.Mean) + gaussian.Mean;
}while(randomNumber > gaussian.Mean + gaussian.StandardDeviation);
return randomNumber;
}