package org.noregret.math
{
/**
* @author Nox Noctis
*/
/**
* Берем величину, распределенную равномерно (Math.random()) и переводим в величину, распределенную стандартно.
* В данном случае используется один из самых быстрых алгоритмов такого перевода - преобразование Бокса-Мюллера.
*/
final public class Random
{
/**
* @param mean: среднее значение
* @param deviation: разброс (среднеквадратичное отклонение)
* @return Массив из двух элементов: [x, y]
*/
public static function gaussianRandomPolar(mean : Number, deviation : Number) : Array
{
var x1 : Number, x2 : Number;
var y1 : Number, y2 : Number;
var w : Number;
// Преобразование Бокса—Мюллера
// Box-Muller transform
do {
x1 = 2.0 * Math.random() - 1.0;
x2 = 2.0 * Math.random() - 1.0;
w = x1 * x1 + x2 * x2;
} while ( w >= 1.0 );
w = Math.sqrt((-2.0 * Math.log(w) ) / w);
y1 = x1 * w * deviation + mean;
y2 = x2 * w * deviation + mean;
return [y1, y2];
}
/**
* @param mean: среднее значение
* @param deviation: разброс (среднеквадратичное отклонение)
* @return Число
*/
public static function gaussianRandom(mean : Number, deviation : Number) : Number
{
var point:Array = gaussianRandomPolar(mean, deviation);
return Math.sqrt(point[0] * point[0] + point[1] * point[1]);
}
}
}
|