Math.random()与Random.nextInt(int)

时间:2009-04-10 19:29:10

标签: java random

Math.random() * nRandom.nextInt(n)之间有什么区别n是一个整数?

4 个答案:

答案 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&#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)