在JavaScript中随机数的探索中,我发现了一个令人惊讶的 bug,在Google Chrome的 V8 JavaScript 引擎中可能存在。例如:
// 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中看到了类似的结果,这让我相信它不是特定于Chrome的。有时会出现不同或多个神秘值(7、9等)。
有人能解释一下我为什么会得到我看到的结果吗?我猜想这可能与使用parseInt
(而不是Math.floor()
)有关,但我仍然不确定为什么会发生这种情况。
TypeError
,这是 Java 的方式。JavaScript 中的大多数 API 只是尝试使用无效类型而不是抛出错误。 - Esailija