Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Нормальное и равномерное распределение в JavaScript (Math.Random) (https://javascript.ru/forum/misc/48020-normalnoe-i-ravnomernoe-raspredelenie-v-javascript-math-random.html)

Baldin 16.06.2014 22:02

Нормальное и равномерное распределение в JavaScript (Math.Random)
 
Здравствуйте, ув. форумчане.
Насколько я знаю, в 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(). Как сделать нормальное распределение? Прошу помощи :help:

Если делать по методу Бокса-Мюллера, будет правильно?
Как-то так:
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; 
}


Часовой пояс GMT +3, время: 15:00.