`
liukai
  • 浏览: 701509 次
  • 性别: 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中random.nextInt()与Math.random()的基础用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    java随机数

    1.java.util.concurrent.ThreadLocalRandom.current().nextInt(10) 这个新的API综合了其他两种方法的优点:单一实例/静态访问,就像Math.random()一样灵活。ThreadLocalRandom也比其他任何处理高并发的方法要更快。 ...

    Java Random类的详细介绍(Java生成随机数)

    生成指定范围的数字2.Random.nextInt()与Math.random()的区别 一、Random类的使用 Random类的功能,生成一个随机数 1.Random类生成随机数(int)的基本语法: (1)生成int取值范围的任意一个数 Random r = new Random...

    Java设计幼儿园小孩子智力开发竞赛活动小游戏代码.docx

    int num1 = (int)(Math.random() * 10); int num2 = (int)(Math.random() * 10); int sum = num1 + num2; System.out.print(num1 + " + " + num2 + " = "); Scanner input = new Scanner(System.in); int ...

    java--拼图游戏源代码

    java.util.Random rnd=new java.util.Random(); int temp,x1,x2,y1,y2; for(int i=0;i;i++){ x1=rnd.nextInt(4); x2=rnd.nextInt(4); y1=rnd.nextInt(4); y2=rnd.nextInt(4); temp=map[x1][y1]...

    Java斗牛和投筛子【终极版】

    System.out.println("已进入游戏 , 按1继续 退出请按 2 "); int t = scanner.nextInt();... int number = (int) (Math.random() * (max + 1 - min) + min); System.out .println("请选择 开始游戏

    JAVA 生成随机数的3种方法

    Math.random 方法,创建一个double类型的随机数 ThreadLocalRandom class 1) java.util.Random 要使用这个方法,首先要生成一个实例。来调用它的nextInt(),nextDouble(), nextLong() 等等 我们可以使用这个类来生成...

    石头剪子布源码

    石头剪子布Scanner in=new Scanner(System.in); System.out.println... int computer=(int)(Math.random()*3)+1; String Marks="拳头";//这是做一个标记; String Marks2="拳头"; switch(person){ case 1:

    练习+人机猜拳全部实现代码

    ans=(Math.abs(random.nextInt())%3)+1; String anw; if(ans==1){ anw="剪刀"; }else if(ans==2){ anw="石头"; }else { anw="布"; } System.out.println("电脑出拳:"+anw); } }

    超市管理系统代码示例

    生成8位唯一的随机卡号(int)(Math.random()* 90000000)+ 10000000 或 Random ran = new Random() int id = ran.nextInt(110000000)+10000000; 开卡赠送积分 存到list集合 2、积分累计: 会员登陆...

    Java 随机数比较和分析

    概况:  本文概述2种jdk的随机数实现方式,旨在了解其运行机理。并得出运行效率比较。但这2种随机数生成还是会存在一定安全风险(伪随机数有可能会被猜出随机序列),...  2、java.util.Random的nextInt(n)方法 —

    webcoder-index.html

    网络编码器 输入 结果 3 [2,3,1] 5 [4,2,1,3,5] ...import java.util.Scanner fun main ( args : Array ) { ... mList[ 0 ] = ( 1 + Math .random() * size).toInt() while (i < size) { value = ( 1 + Math

    达内 coreJava 习题答案

    import java.util.Scanner; class Bissextile{ public static void main(String[] arge){ System.out.print("请输入年份"); int year; //定义输入的年份名字为“year” Scanner scanner = new Scanner(System.in...

    kuhuesocket

    import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Scanner; import serverSide.Goods; import socketFunction.ClientSocket; ...

    jsp探针 ver0.1

    java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader( process.getInputStream())); String freeSpace = "", line; while ((line = in.readLine()) != null) { if (line.length...

    xrandom:Xorshift随机数生成器

    算法是最快的随机数生成器中已知的,它需要非常小的代码和状态。 速度 使用AOT编译的二进制文件生成1亿个随机数。 时间(越低越好) nextInt 下一个双人间 nextBool 随机(dart:math) 2323 3107 2264 ...

    射击游戏 android

    float y = random.nextInt(getHeight()-targetBmp.getHeight()); float speed = Tools.sharedTools(GameView.this.context).getSetting(GameView.this.level).targetSpeed; targets.add(new ...

    j2me手机游戏代码

    import java.util.Random; import java.util.Vector; import javax.microedition.media.*; public class SwordCanvas extends Canvas implements PopupListener { static int life,energy,skillpoint,x,y,maxlife,...

Global site tag (gtag.js) - Google Analytics