Math.random() uses Random.nextDouble() internally.
Random.nextDouble() uses Random.next() twice to generate a double that has approximately uniformly distributed bits in its mantissa, so it is uniformly distributed in the range 0 to 1-(2^-53).
Random.nextInt(n) uses Random.next() less than twice on average- it uses it once, and if the value obtained is above the highest multiple of n below MAX_INT it tries again, otherwise is returns the value modulo n (this prevents the values above the highest multiple of n below MAX_INT skewing the distribution), so returning a value which is uniformly distributed in the range 0 to n-1.
Prior to scaling by 6, the output of Math.random() is one of 2^53 possible values drawn from a uniform distribution.
Scaling by 6 doesn't alter the number of possible values, and casting to an int then forces these values into one of six 'buckets' (0, 1, 2, 3, 4, 5), each bucket corresponding to ranges encompassing either 1501199875790165 or 1501199875790166 of the possible values (as 6 is not a disvisor of 2^53). This means that for a sufficient number of dice rolls (or a die with a sufficiently large number of sides), the die will show itself to be biased towards the larger buckets.
You will be waiting a very long time rolling dice for this effect to show up.
Math.random() also requires about twice the processing and is subject to synchronization.
Random rand = new Random(); long startTime = System.nanoTime() ; int i1 = rand.nextInt(1000000000); System.out.println(i1); long endTime = System.nanoTime(); System.out.println("Random.nextInt(): " + (endTime - startTime)); long startTime2 = System.nanoTime(); int i2 = (int) (java.lang.Math.random() * 1000000000); System.out.println(i2); long endTime2 = System.nanoTime(); System.out.println("Math.random():" + (endTime2 - startTime2));
前者生成的随机数效率高于后者,时间上前者大约是后者50%到80%的时间.
造成这个原因如下:
Math.random()是Random.nextDouble()的一个内部方法.
Random.nextDouble()使用Random.next()两次,均匀的分布范围为0到1 - (2 ^ -53).
Random.nextInt(n)的使用Random.next()不多于两次, 返回值范围为0到n - 1的分布
相关推荐
本文将详细解释`random.nextInt()`和`Math.random()`的基础用法。 首先,`random.nextInt(n)`是`Random`类的一个方法,用于生成0到n(不包括n)之间的整数。这个方法内部实现时,如果n是2的幂,它会执行更高效的...
Java提供了两种主要的方法来生成随机数:`Math.random()` 和 `java.util.Random` 类。虽然两者都能生成随机数,但它们之间存在一些关键的区别。 首先,`Math.random()` 是一个静态方法,它直接位于 `Math` 类中,...
Java Random类的nextInt()方法详解 Java 中的 Random 类提供了一个名为 nextInt() 的方法,该方法可以生成一个随机的整数值,该值介于指定的区间内。下面将详细介绍该方法的使用方法和示例代码。 nextInt() 方法的...
g.rotate(Math.toRadians(random.nextInt(-30, 30)), x, y); g.drawString(captchaCode.charAt(i) + "", x, y); g.rotate(-Math.toRadians(random.nextInt(-30, 30)), x, y); } ``` 5. 添加水印: 水印可以是...
在JSP中,我们可以利用Java的Math.random()函数和字符数组来生成这个序列。例如: ```java String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; StringBuilder sb = new ...
g.rotate(Math.random() * Math.PI / 18, x, y); g.drawString(String.valueOf(c), x, y); } g.dispose(); ``` 6. **保存或输出图像**:最后,可以将生成的图像保存为PNG或其他格式的文件,或者直接输出到HTTP...
g2d.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } for (int i = 0; i ; i++) { g2d.setPaint(new Color(random.nextInt(255), random.nextInt...
g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } // 绘制文字 g.setColor(Color.BLUE); g.setFont(new Font("Arial", Font.BOLD, 20)); ...
本文将详细探讨Java中生成随机数的两种主要方法:`java.lang.Math.random()`静态方法和`java.util.Random`类。 首先,我们来看`java.lang.Math.random()`方法。这是一个静态方法,不需要实例化对象就可以直接调用。...
String rand = String.valueOf((int)(Math.random() * 10)); sRand += rand; g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); g.drawString(rand, 13 *...
本篇文章将详细介绍Java中生成随机数的两种主要方法:使用`java.lang.Math.random()`静态方法和创建`java.util.Random`对象。 ### 一、`java.lang.Math.random()`静态方法 `Math.random()`是一个静态方法,无需...
int index = (int) (Math.random() * 62); String[] letters = {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "a", "s", "d", "f", "g", "h", "j", "k", "l", "z", "x", "c", "v", "b", "n", "m", "Q", "W...
String captchaCode = new String(new char[4]).replace('\0', chars[random.nextInt(chars.length)]); ``` 2. **图像创建**:使用Java的`java.awt.image.BufferedImage`类创建一个图像对象,设定其宽度和高度。...
g2d.rotate(Math.random() * Math.PI / 5 - Math.PI / 10, x, y); g2d.drawString(String.valueOf(c), x, y); } ``` 5. **保存和显示图像**:最后,我们可以将图像保存到文件或者直接显示在网页或GUI应用中。 ``...
affineTransform.rotate(Math.toRadians(random.nextInt(10) - 5)); g.setTransform(affineTransform); g.drawString(code, 10, 30); ``` 4. **保存和显示图像**:生成的验证码图像可以保存为JPEG或PNG格式,然后...
g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g2d.fillRect(x, y, 1, 1); } // 设置字体 Font font = new Font("Arial", Font.BOLD, 28); g2d.setFont(font); ...
此外,还可以利用`Math.random()`方法生成双精度浮点型的随机数。 - **随机数范围控制**:在实际应用中,我们需要根据需求限制随机数的取值范围。例如,在彩票游戏中,我们可能只需要生成1到53之间的整数。 #### 2....
Java提供两种主要的方式来生成随机数:`java.lang.Math.random()` 和 `java.util.Random` 类。这两种方法各有优劣,适用于不同的场景。 #### Math.random() `Math.random()` 是一个简单易用的方法,用于生成一个...
at.rotate(Math.random() * 0.3 - 0.15, (c - 'A') * 20 + 10, 30); g.setTransform(at); g.drawString(String.valueOf(c), (c - 'A') * 20 + 10, 35); } // 添加噪声 g.setColor(new Color(220, 220, 220, ...
例如,你可以创建一个包含字母和数字的字符数组,然后用`Random`类的`nextInt()`方法来选择数组中的元素。 ```java String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; ...