是什么区别Math.random() * n
和Random.nextInt(n)
在那里n
是一个整数?
是什么区别Math.random() * n
和Random.nextInt(n)
在那里n
是一个整数?
Answers:
这是Gili链接到的Sun论坛帖子中为什么“ 比“ 效率更高,偏见更少的详细说明:Random.nextInt(n)
Math.random() * n
Math.random()内部使用Random.nextDouble()。
Random.nextDouble()两次使用Random.next()来生成一个在其尾数中具有近似均匀分布的位的double,因此它在0到1-(2 ^ -53)的范围内均匀分布。
Random.nextInt(n)平均使用Random.next()少于两次-它使用一次,并且如果获得的值高于MAX_INT以下的n的最高倍数,它将再次尝试,否则返回模n的值(这是防止高于MAX_INT的n的最高倍数的值倾斜分布),因此返回一个在0到n-1范围内均匀分布的值。
在按比例缩放6之前,Math.random()的输出是从均匀分布中提取的2 ^ 53个可能值之一。
缩放为6不会更改可能值的数量,然后将其强制转换为int会强制将这些值放入六个“存储桶”(0、1、2、3、4、5)之一,每个存储桶对应于包含其中一个范围的范围1501199875790165或1501199875790166的可能值(因为6不是2 ^ 53的视变数)。这意味着对于足够数量的骰子辊(或具有足够数量的侧面的骰子),骰子将显示自己偏向较大的铲斗。
您将要等待很长时间才能看到这种效果。
Math.random()还需要大约两次处理,并且需要进行同步。
6
为5
:将“ 5偏置”。在发现骰子出问题之前,您可以掷骰子几次。在您发现随机生成器出现问题之前,您必须进行极为复杂的彻底检查。
据https://forums.oracle.com/forums/thread.jspa?messageID=6594485�相比, Random.nextInt(n)
它效率更高,偏差更少Math.random() * n
根据此示例,Random.nextInt(n)
其可预测的输出比Math.random()* n小。根据[排序数组比未排序数组快] [1],我认为我们可以说Random.nextInt(n)很难预测。
usingRandomClass:时间:328英里。
usingMathsRandom:时间:187英里。
package javaFuction;
import java.util.Random;
public class RandomFuction
{
static int array[] = new int[9999];
static long sum = 0;
public static void usingMathsRandom() {
for (int i = 0; i < 9999; i++) {
array[i] = (int) (Math.random() * 256);
}
for (int i = 0; i < 9999; i++) {
for (int j = 0; j < 9999; j++) {
if (array[j] >= 128) {
sum += array[j];
}
}
}
}
public static void usingRandomClass() {
Random random = new Random();
for (int i = 0; i < 9999; i++) {
array[i] = random.nextInt(256);
}
for (int i = 0; i < 9999; i++) {
for (int j = 0; j < 9999; j++) {
if (array[j] >= 128) {
sum += array[j];
}
}
}
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
usingRandomClass();
long end = System.currentTimeMillis();
System.out.println("usingRandomClass " + (end - start));
start = System.currentTimeMillis();
usingMathsRandom();
end = System.currentTimeMillis();
System.out.println("usingMathsRandom " + (end - start));
}
}
Math.random()