Tout en jouant avec des nombres aléatoires en JavaScript, j'ai découvert un bug surprenant, sans doute dans le moteur JavaScript V8 de Google Chrome. Considérer:
// 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;
};
Maintenant quand je le lance en testRand5()
- je obtenir les résultats suivants (bien sûr, légèrement différentes à chaque exécution, vous pourriez avoir besoin pour définir "max" pour une valeur plus élevée pour révéler le bug):
var d = testRand5();
d = {
1: 1002797,
2: 998803,
3: 999541,
4: 1000851,
5: 998007,
10: 1 // XXX: Math.random() returned 4.5?!
}
Il est intéressant de noter, je vois des résultats comparables dans node.js, m'amenant à croire que c'est pas spécifique à google Chrome. Parfois, il y a différentes ou plusieurs mystère valeurs (7, 9, etc).
Quelqu'un peut-il expliquer pourquoi je suis peut-être obtenir les résultats que je vois? J'imagine qu'il a quelque chose à faire avec l'aide d' parseInt
(au lieu de Math.floor()
) mais je ne suis toujours pas sûr de savoir pourquoi cela pourrait se produire.