`
liukai
  • 浏览: 706385 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java: Random.nextInt() 和Math.random()的区别

    博客分类:
  • java
阅读更多
今天用了find bugs后查出来了个问题
Google了下
发现
Random.nextint() 和Math.random()的区别

(经下面朋友提醒,再去Google了下 终于知道两者的区别了~,E文不好真知道大体意思)
http://stackoverflow.com/questions/738629/math-random-versus-random-nextintint
2个Exp:
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的分布


分享到:
评论
3 楼 liukai 2010-08-05  
freish 写道
LZ误导人了

在我机器上按LZ给的代码跑的时间都是0

于是我都改成System.nanoTime(),跑出的结果如下:
859251609
Random.nextInt(): 221257
954488750
Math.random():81574

每次Math的效率都比Random高一倍以上

jdk:sun 1.5.0_04


换做IBMjdk50后,发现两者效率都有所下降,Math降到了6位数,但在我所执行的次数里,都比Random快三四倍的样子
375880502
Random.nextInt(): 593930
739375906
Math.random():166781

确是是我错了
经过多次测试
Math.random()生成的时间是Random.nextInt()的50%或80%
但是是以纳秒级算的 感觉时间不是这两者最主要的区别.
2 楼 freish 2009-09-26  
另外经过测试,在jdk1.5中出现的Math上六位数的情况很少
而在jdk1.6,1.7中都频繁的出现了Math在六位数的纳秒级上
1 楼 freish 2009-09-26  
LZ误导人了

在我机器上按LZ给的代码跑的时间都是0

于是我都改成System.nanoTime(),跑出的结果如下:
859251609
Random.nextInt(): 221257
954488750
Math.random():81574

每次Math的效率都比Random高一倍以上

jdk:sun 1.5.0_04


换做IBMjdk50后,发现两者效率都有所下降,Math降到了6位数,但在我所执行的次数里,都比Random快三四倍的样子
375880502
Random.nextInt(): 593930
739375906
Math.random():166781

相关推荐

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

    在Java编程语言中,生成随机数是常见的任务,这通常涉及到`java.util.Random`类和`java.lang.Math`类中的`random()`方法。本文将详细解释`random.nextInt()`和`Math.random()`的基础用法。 首先,`random.nextInt(n...

    浅谈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实现验证码的绘制

    生成随机字符串,可以使用`java.util.Random`和`Character`类结合ASCII码来实现: ```java String captchaCode = ""; for (int i = 0; i ; i++) { captchaCode += (char) (random.nextInt(26) + 'a'); } ``` ...

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

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

    本文将详细探讨Java中生成随机数的两种主要方法:`java.lang.Math.random()`静态方法和`java.util.Random`类。 首先,我们来看`java.lang.Math.random()`方法。这是一个静态方法,不需要实例化对象就可以直接调用。...

    java随机数

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

    模拟彩票机选 用java编写的小程序

    在Java中,我们可以使用`java.util.Random`类来生成随机数。这个类提供了各种方法来生成不同类型的随机数,如整数、浮点数等。在模拟彩票机选的情况下,我们需要生成一定范围内的随机整数。例如,如果我们要模拟...

    绘制刷新判断验证码

    在Java中,可以使用`Random`类生成随机数字和字符,再结合字母表来构建验证码的文本内容。例如: ```java import java.util.Random; public class CaptchaUtil { private static final String CHAR_LOWER = ...

    Java中Random类.pdf

    Java中Random类 Java中Random类提供了产生多种形式随机数的功能。使用Random类,可以轻而易举地产生所需的所有形式的随机数,十分方便。在程序设计中,需要大量的不同形式的随机数,使用Math类的random()方法还必须...

    Java产生随机数的两种方式.doc

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

    实验8Java基本类库.pdf

    1. **Math类**:Java中的Math类提供了一系列的静态方法,用于执行基本的数学运算。例如,`random()`方法可以生成一个0.0到1.0之间的随机浮点数,通过乘以特定值可以得到指定范围内的随机整数。`sin()`, `log()`, `...

    java图形验证码

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

    java中数学操作类的简介共5页.pdf.zip

    Java语言在处理数学运算时提供了丰富的工具类,主要集中在`java.lang.Math`和`java.util.Random`两个核心类中。本文将深入探讨这两个类的主要功能和使用方法。 首先,我们来看`java.lang.Math`类。这是一个包含基本...

    Java软件开发实战 Java基础与案例开发详解 9-6 Random类和Math类 共9页.pdf

    ### Java软件开发实战:Random类和Math类 在Java编程中,`Random`类和`Math`类是非常实用且常用的工具类,它们提供了生成随机数和执行数学运算的方法。本篇将详细介绍这两个类的主要功能及其应用场景。 #### 1. `...

    java获取随机数的3种方法和总结.docx

    `Math.random()` 是 `java.lang.Math` 类中的一个静态方法,它会返回一个0.0到1.0之间的随机浮点数,不包括1.0。若要生成指定范围内的整数随机数,例如1到10,可以使用如下公式: ```java int randomNum = (int)...

    java漂亮的验证码

    - **BufferedImage**:Java中的图像处理类,用于创建和操作图像。我们可以在此类上绘制验证码,然后将其输出为JPEG或PNG格式。 - **Random类**:用于生成随机数,包括字符序列和噪声图形的位置、大小等。 - **Font...

    java验证码

    2. **绘制验证码图像**:Java的`java.awt`和`javax.imageio`包提供了绘制图形的功能。我们可以创建一个`BufferedImage`对象,然后在上面绘制随机字符串,添加扭曲、噪声、颜色等效果,使其更难被机器识别。例如: ``...

Global site tag (gtag.js) - Google Analytics