2014-11-07 3 views
0

В MDN Math.random веб-страницу комментарий для примера функции getRandomInt(..) говорит, что Math.round() не используется, так как это дает неравномерное распределение, , который предполагает использование Math.Floor (..) будет производить равномерное распределение.Генерация равномерного распределения с использованием Math.random()

// Returns a random integer between min (included) and max (excluded) 
// Using Math.round() will give you a non-uniform distribution! 
function getRandomInt(min, max) { 
    return Math.floor(Math.random() * (max - min)) + min; 
} 

Однако следующий код показывает, что частота генерации случайного числа прямо пропорциональна значению числа. i.e Чем выше значение числа, тем выше частота. Это поведение аналогично на nodejs и в браузере Firefox..

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random 

// Returns a random integer between min (included) and max (excluded) 
// Using Math.round() will give you a non-uniform distribution! 
function getRandomInt(min, max) { 
    return Math.floor(Math.random() * (max - min)) + min; 
} 

var data = {}; 
var a; 
var i = 0; 
for (i = 0; i < 100000; ++i) 
{ 
    a = getRandomInt(1,50); 

    if (typeof data[a] === 'undefined') { // first time initialize 
    data[a] = a; 
    } else { 
    data[a] = data[a] + a; 
    } 
} 
console.log(data); 

Следующая jsfiddle имеет приведенный выше код http://jsfiddle.net/hd9tt509/

Так что с этим свойством Math.random(), как произвести равномерное распределение.

ответ

1

Вы увеличиваете счетчик, используя a. Результатом счетчика будет a*<actual frequency>.

Если вы увеличиваете число с 1, вы увидите, что на самом деле оно имеет равномерное распределение.

if (typeof data[a] === 'undefined') { // first time initialize 
    data[a] = 1; 
} else { 
    data[a] = data[a] + 1; 
} 

http://jsfiddle.net/hd9tt509/1/

Смежные вопросы