В 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(), как произвести равномерное распределение.