При воспроизведении со случайными числами в 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 ()
) Но я до сих пор не уверен, что это может произойти.