gpt4 book ai didi

javascript - Math.random() 返回值大于一?

转载 作者:IT王子 更新时间:2023-10-29 03:08:04 25 4
gpt4 key购买 nike

在 JavaScript 中使用随机数时,我发现了一个令人惊讶的错误,大概是在 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())有关,但我仍然不确定为什么会发生这种情况。

最佳答案

边缘情况发生在您碰巧生成一个非常小的数字时,用指数表示,例如 9.546056389808655e-8

parseInt 相结合,将参数解释为字符串,一切都变得一团糟。正如我之前所建议的,它可以使用 Math.floor 来解决。

自己用这段代码试试:

var test = 9.546056389808655e-8;

console.log(test); // prints 9.546056389808655e-8
console.log(parseInt(test)); // prints 9 - oh noes!
console.log(Math.floor(test)) // prints 0 - this is better

关于javascript - Math.random() 返回值大于一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7353592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com