`
chamwarren
  • 浏览: 12253 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Random.nextint() 和Math.random()的区别

    博客分类:
  • java
阅读更多

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的分布

分享到:
评论

相关推荐

    实例讲解Java中random.nextInt()与Math.random()的基础用法

    本文将详细解释`random.nextInt()`和`Math.random()`的基础用法。 首先,`random.nextInt(n)`是`Random`类的一个方法,用于生成0到n(不包括n)之间的整数。这个方法内部实现时,如果n是2的幂,它会执行更高效的...

    浅谈java中Math.random()与java.util.random()的区别

    Java提供了两种主要的方法来生成随机数:`Math.random()` 和 `java.util.Random` 类。虽然两者都能生成随机数,但它们之间存在一些关键的区别。 首先,`Math.random()` 是一个静态方法,它直接位于 `Math` 类中,...

    java Random.nextInt()方法的具体使用

    Java Random类的nextInt()方法详解 Java 中的 Random 类提供了一个名为 nextInt() 的方法,该方法可以生成一个随机的整数值,该值介于指定的区间内。下面将详细介绍该方法的使用方法和示例代码。 nextInt() 方法的...

    用JAVA实现验证码的绘制

    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彩色验证码

    在JSP中,我们可以利用Java的Math.random()函数和字符数组来生成这个序列。例如: ```java String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; StringBuilder sb = new ...

    JAVA动态生成验证码的JAVA实现的代码

    g.rotate(Math.random() * Math.PI / 18, x, y); g.drawString(String.valueOf(c), x, y); } g.dispose(); ``` 6. **保存或输出图像**:最后,可以将生成的图像保存为PNG或其他格式的文件,或者直接输出到HTTP...

    java实现验证码

    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中生成随机数的两种主要方法:`java.lang.Math.random()`静态方法和`java.util.Random`类。 首先,我们来看`java.lang.Math.random()`方法。这是一个静态方法,不需要实例化对象就可以直接调用。...

    jsp验证码(图形)

    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产生随机数的两种方式.doc

    本篇文章将详细介绍Java中生成随机数的两种主要方法:使用`java.lang.Math.random()`静态方法和创建`java.util.Random`对象。 ### 一、`java.lang.Math.random()`静态方法 `Math.random()`是一个静态方法,无需...

    Java实现两种验证码

    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...

    java验证码实现

    String captchaCode = new String(new char[4]).replace('\0', chars[random.nextInt(chars.length)]); ``` 2. **图像创建**:使用Java的`java.awt.image.BufferedImage`类创建一个图像对象,设定其宽度和高度。...

    java生成验证码

    g2d.rotate(Math.random() * Math.PI / 5 - Math.PI / 10, x, y); g2d.drawString(String.valueOf(c), x, y); } ``` 5. **保存和显示图像**:最后,我们可以将图像保存到文件或者直接显示在网页或GUI应用中。 ``...

    java图形验证码

    affineTransform.rotate(Math.toRadians(random.nextInt(10) - 5)); g.setTransform(affineTransform); g.drawString(code, 10, 30); ``` 4. **保存和显示图像**:生成的验证码图像可以保存为JPEG或PNG格式,然后...

    java漂亮的验证码

    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提供两种主要的方式来生成随机数:`java.lang.Math.random()` 和 `java.util.Random` 类。这两种方法各有优劣,适用于不同的场景。 #### Math.random() `Math.random()` 是一个简单易用的方法,用于生成一个...

    Java实现验证码的制作

    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, ...

    java大码生成验证码

    例如,你可以创建一个包含字母和数字的字符数组,然后用`Random`类的`nextInt()`方法来选择数组中的元素。 ```java String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; ...

Global site tag (gtag.js) - Google Analytics