Math.random () Возвращает значение больше одного?

При воспроизведении со случайными числами в JavaScript я обнаружил удивительную ошибку, предположительно в двигателе V8 JavaScript в Google Chrome. Рассмотрим:

// Generate a random number [1,5].
var rand5 = function() {
  return parseInt(Math.random() * 5) + 1;
};

// Return a sample distribution over MAX times.
var testRand5 = function(dist, max) {
  if (!dist) { dist = {}; }
  if (!max) { max = 5000000; }
  for (var i=0; i<max; i++) {
    var r = rand5();
    dist[r] = (dist[r] || 0) + 1;
  }
  return dist;
};

Теперь, когда я бегу TESTRAND5 () Я получаю следующие результаты (конечно, немного отличаться с каждым прогоном, вам может потребоваться установить «max» на более высокое значение, чтобы раскрыть ошибку) :

var d = testRand5();
d = {
  1: 1002797,
  2: 998803,
  3: 999541,
  4: 1000851,
  5: 998007,
  10: 1 // XXX: Math.random() returned 4.5?!
}

Интересно, что я вижу сопоставимые результаты в Node.js, ведущим мне верить, что это не специфично для хрома. Иногда существуют разные или несколько ценностей загадки (7, 9 и т. Д.).

Кто-нибудь может объяснить, почему я могу получить результаты, которые я вижу? Я предполагаю, что это есть что делать с использованием Parсент (вместо Math.floor () ) Но я до сих пор не уверен, что это может произойти.

40
задан Josh Lee 13 September 2011 в 17:20
поделиться