Здравствуйте, ув. форумчане.
Насколько я знаю,
в JS Math.Random() генерирует числа по равномерному распределению (хотя опять же, разные источники говорят разное), какие манипуляции нужно проделать, чтобы
перейти к нормальному распределению чисел?
Необходимо для построения графика процесса авторегрессии в моделировании случайных процессов стохастических объектов
google.load("visualization", "1", {packages:["corechart"]});
// google.setOnLoadCallback(drawChart);
function drawChart() {
document.getElementById("chart_div").style.display = "";
var N = document.getElementById("inN").value;
var a1 = document.getElementById("inA1").value;
var arrRand = [];
var arrRandNotSrednee = [];
var srednee = 0;
var disperciy = 0;
for ( var i = 0; i < N; ++i ){
arrRand[i] = Math.random();
srednee += arrRand[i];
}
srednee /= N;
for ( var i = 0; i < N; ++i ){
arrRandNotSrednee[i] = arrRand[i] - srednee;
disperciy += arrRandNotSrednee[i] * arrRandNotSrednee[i];
}
disperciy /= N;
var otklonenie = Math.sqrt(disperciy);
var X = [];
for ( var i = 0; i < N; ++i ){
X[i] = arrRandNotSrednee[i] / otklonenie;
}
var Y = [];
Y[0] = X[0];
for ( var i = 1; i < N; ++i ){
Y[i] = a1 * Y[i-1] + X[i];
}
var arr = [];
arr[0] = ['t', 'y(t)'];
for ( var i = 1; i <= N; ++i ){
arr[i] = [i, Y[i-1]];
}
var data = google.visualization.arrayToDataTable(arr);
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data);
}
P.S. График строится на библиотеке Google Charts, некоторые данные берутся из формы, но все это не имеет отношения к вопросу.
Ошибка в скрипте именно в math.random(). Как сделать нормальное распределение? Прошу помощи
Если делать по методу Бокса-Мюллера, будет правильно?
Как-то так:
function GaussRand() {
var s = 2*Math.random()-1;
var m = 2*Math.random()-1;
var u = s*s + m*m;
if(u == 0 || u > 1) return GaussRand();
var k = Math.sqrt(-2*Math.log(u)/u);
return s*m;
}