Math.random() * n
和Random.nextInt(n)
之间有什么区别n
是一个整数?
答案 0 :(得分:159)
以下是the detailed explanation为什么“Random.nextInt(n)
与Gili相关联的Sun论坛帖子中的Math.random() * n
更高效,更少偏见”
Math.random()在内部使用Random.nextDouble()。
Random.nextDouble()使用Random.next()两次生成一个双尾,在其尾数中具有近似均匀分布的位,因此它均匀分布在0到1-(2 ^ -53)的范围内。 p>
Random.nextInt(n)使用的Random.next()平均少于两次 - 它使用一次,如果获得的值高于MAX_INT以下n的最高倍数,则再次尝试,否则返回值modulo n(这可以防止高于MAX_INT的最高倍数的值偏离分布),因此返回一个均匀分布在0到n-1范围内的值。
在按比例缩放6之前,Math.random()的输出是从均匀分布中提取的2 ^ 53个可能值之一。
按6缩放不会改变可能的值的数量,并且转换为int然后将这些值强制为六个“桶”(0,1,2,3,4,5)中的一个,每个桶对应于范围包含可能值的1501199875790165或1501199875790166(因为6不是2 ^ 53的主管)。这意味着对于足够数量的骰子卷(或具有足够大的边数的骰子),骰子将显示出偏向更大的骰子。
你会等很长时间骰子让这个效果出现。
Math.random()也需要大约两倍的处理时间并且需要同步。
答案 1 :(得分:27)
另一个重点是Random.nextInt(n)是可重复的,因为你可以使用相同的种子创建两个Random对象。 Math.random()无法做到这一点。
答案 2 :(得分:14)
根据https://forums.oracle.com/forums/thread.jspa?messageID=6594485� Random.nextInt(n)
比Math.random() * n
答案 3 :(得分:0)
根据此示例,// Variables for storing currently highlighted feature and delay amount
var highlight, delay = 0;
// Iterate over each layer in the geojsonlayer
geojson.eachLayer(function (layer) {
// Mimick event object because highlightFeature and resetHighlight
// expect an object with the layer as target property
layer = {'target': layer};
// Up the delay amount
delay = delay + 3000;
setTimeout(function() {
// Check if there is a highlight, if so reset
if (highlight) {
resetHighlight(highlight);
}
// Highlight current and store
highlightFeature(layer);
highlight = layer;
}, delay);
});
具有较少的可预测输出,然后是Math.random()* n。根据[排序数组比未排序数组更快] [1]我认为我们可以说Random.nextInt(n)难以预测。
usingRandomClass:time: 328 milesecond。
usingMathsRandom:time: 187 milesecond。
Random.nextInt(n)