随机()与随机.nextInt (int)的比较

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

147301 次浏览

根据 https://forums.oracle.com/forums/thread.jspa?messageID=6594485&#6594485Random.nextInt(n)既比 Math.random() * n更有效率,也比 Math.random() * n更少偏差

以下是来自太阳报论坛的一篇文章中关于为什么“ Random.nextInt(n)Math.random() * n更有效率,偏见也更少”的 详细的解释,吉利链接如下:

Random ()在内部使用 Ranch.nextDouble ()。

NextDouble ()两次使用 Ranch.next ()生成一个双精度数,它在尾数中具有近似均匀分布的位,因此它在0到1-(2 ^ -53)的范围内均匀分布。

NextInt (n)平均不超过两次使用 Rough.next ()-它只使用一次,如果得到的值高于 MAX _ INT 下 n 的最大倍数,它会再次尝试,否则返回模 n (这样可以防止在 MAX _ INT 下 n 的最大倍数以上的值扭曲分布) ,所以返回一个均匀分布在0到 n-1范围内的值。

在缩放6之前,Math.Random ()的输出是从均匀分布中提取的2 ^ 53个可能值之一。

缩放6并不会改变可能值的数目,并且将这些值强制转换为 int,然后将这些值强制转换为6个“桶”(0,1,2,3,4,5)中的一个,每个桶对应的范围包括可能值的1501199875790165或1501199875790166(因为6不是2 ^ 53的除数)。这意味着对于足够数量的骰子投掷(或者一个骰子有足够大的边) ,骰子会偏向于更大的桶。

你将等待很长一段时间掷骰子为这个效果显示。

Random ()也需要大约两倍的处理,并且需要进行同步。

另一个重要的地方在于 Ranch.nextInt (n)是可重复的,因为您可以使用 一样种子创建两个 Random 对象。这在 Math.Random ()中是不可能的。

根据这个例子,Random.nextInt(n)的可预测输出比 Math.Random () * n 少。根据[排序的数组比未排序的数组快][1] ,我想我们可以说 R幽默.nextInt (n)是 很难预测

时间: 328英里秒。

时间: 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));


}


}