Стандартный генератор случайных чисел, который вы получили (rand()
в C после простого преобразования, эквиваленты во многих языках), является довольно хорошим приближением к равномерному распределению по диапазону [0,1].Если это то, что вам нужно, все готово.Также легко преобразовать это в случайное число, сгенерированное в несколько большем целочисленном диапазоне.
Преобразование равномерного распределения в нормальное распределение уже было рассмотрено на на SO , как и Экспоненциальное распределение .
[РЕДАКТИРОВАТЬ]: Для треугольного распределения преобразование равномерной переменной является относительно простым (в чем-то С-образным):
double triangular(double a,double b,double c) {
double U = rand() / (double) RAND_MAX;
double F = (c - a) / (b - a);
if (U <= F)
return a + sqrt(U * (b - a) * (c - a));
else
return b - sqrt((1 - U) * (b - a) * (b - c));
}
Это просто преобразование формулы, приведенной на странице Википедии.Если вы хотите, чтобы другие, это место, чтобы начать искать;в общем случае вы используете равномерную переменную, чтобы выбрать точку на вертикальной оси функции совокупной плотности требуемого распределения (при условии, что оно непрерывно), и инвертировать CDF, чтобы получить случайное значение с желаемымраспределение.