您现在的位置: 365建站网 > 365学习 > java随机数获取的方法(Math.random/ran:Random)

java随机数获取的方法(Math.random/ran:Random)

文章来源:365jz.com     点击数:331    更新时间:2018-05-31 20:13   参与评论

Math类和Random类生成的随机数

一、Math类的random()方法


Math类的random()方法可以生成大于等于0.0、小于1.0的double型随机数。

Math.random()方法语句基础上处理可获得多种类型、或任意范围的随机数。

公式:

int num=(int)(Math.random()*n);         //返回大于等于0小于n之间的随机数 
int num0=m+(int)(Matn.randon()*n);      //返回大于等于m小于m+n(不包括m+n)之间的随机数 


例如:我们需要取2~22之间的偶数

public class MathRandomDemo{ 
public static int GetevenNum(double num1,double num2){ 
int s=(int)num1+(int)(Math.random()*(num2-num1)); 
if(s%2==0){ 
return s; 

else 
retuen s+!; 

public static void main(String[] args){ 
System.out.println("任意一个"+num1+"~"+num2+"之间的偶数:"+GeteneNum(2,22)); 


还可以随机生成字符

例如:

1.随机生成a~z之间的字符

(char)('a'+Math.random()*('z'-'a'+1));

2.随机生成cha1~cha2的字符

(char)(cha1+Math.random()*(cha2-cha1+1));


二、Random类生成随机数

除了Math类的Random()方法可以获取随机数之外,还可以Java.util.Random类,可以通过实例化一个Random对象创建一个随机数生成器。

1.语法:

Random ran=new Random(); 


ran:Random类的实例对象

以这种形式实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间都不可能相同,所以产生的随机数也不同。如果运行速度太快,也会产生两次运行结果相同的随机数。



2.可以在实例化Random类对象时,自定义随机数生成器的种子。

语法:

Random ran=new Random(seedValue); 


ran:Random类的实例对象

seedValue:随机类生成器的种子。

Random类中还提供各种类型随机数的方法: 
nextInt():返回一个随机整数(int) 
nextInt(int n):返回大于等于0、小于n的随机整数(int) 
nextLong():返回一个随机长整型值(long) 
nextBoolean():返回一个随机布尔型值(boolean) 
nextFloat():返回一个随机浮点型值(float) 
nextDouble():返回一个随机双精度型值(double) 
nextGaussian():概率密度为高斯分布的双精度值(double) 


例:

import java.util.Random; 
public class Demo{ 
public static void main(String[] args){ 
Random ran=new Random(); 
System.out.println("产生一个随机整数:"+ran.nextlnt()); 

}  



如果要获得区间 [1~100]的随机数,该怎么办呢?稍微动动脑筋就可以想到:区间 [0, 100) 内的整数,实际上就是区间 [0, 99]。因为最大边界为100,可惜不能等于100,因此最大可能产生的“整数”就是99。

既然rand.nextInt(100) 获得的值是区间 [0, 99],那么在这个区间左右各加 1,就得到了区间 [1, 100]。因此,代码写成:

rand.nextInt(100)+ 1;

即可。运行下面的代码,将获得 [1, 100] 的 10 个取值。

import java.util.Random; 
public class Test { 
    public static void main(String[] args){ 
      Random rand = new Random(); 
      for(int i=0; i<10; i++) { 
       System.out.println(rand.nextInt(100) + 1); 
      } 
    } 

同理,很容易知道如果要获得随机两位整数,代码写成:rand.nextInt(90) + 10;

你一定很惊讶,为什么是这么写出来的。其实,在 nextInt() 方法中作为参数的数字 90 表示:你希望生成的随机数的所有取值的可能性的数量(在本命题中,两位整数取值为 [10, 99],共90个数);加好后面的数字 10 ,表示区间的最小取值。

你可以验证下,按照这样理解,[1, 100] 的随机数,是不是应该写成rand.nextInt(100) + 1 。千万不要把参数 100 理解为最大取值。只是区间 [1, 100] 正好从 1 开始,所以最大取值和取值可能性数量正好同为 100。

因此,

生成随机三位数的代码为:

rand.nextInt(900)+ 100;

生成区间 [64,128] 中随机值的代码为:

rand.nextInt(65)+ 64;

取值可能性的数量是如何计算出来的呢?当然是 最大取值-最小取值+1 ,所以,有最终公式如下:

// For Java

int randNumber =rand.nextInt(MAX - MIN + 1) + MIN; // randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数

举例:
  Random r =new Random(100);
  System.out.println(r.nextInt(20));

  种子数只是随机算法的起源数字,和生成的随机数字的区间没有任何关系。

初始化时100并没有起直接作用(注意:不是没有起作用),r.nextInt(20)中的20是随机数的上限,产生的随机数为0-20的整数,不包括20。



举例:

        Random r1 = new Random();
        Random r2 = new Random();
        //无参构造使用的是参数作为种子数
        Random r3 = new Random(100);
        Random r4 = new Random(100);
        //产生随机数调用nextXXX()方法
        System.out.println(r1.nextInt(10));
        System.out.println(r1.nextInt(10));
        System.out.println(r2.nextInt(10));
        System.out.println(r2.nextInt(10));
        System.out.println("-----------------");
        System.out.println(r3.nextInt(10));       
        System.out.println(r3.nextInt(10));
        System.out.println(r4.nextInt(10));
        System.out.println(r4.nextInt(10));


结果:

5
1
4
0
-----------------
5
0
5
0



总结:

  1.同一个种子,生成N个随机数,当你设定种子的时候,这N个随机数是什么已经确定。相同次数生成的随机数字是完全相同的。

  2.如果用相同的种子创建两个 Random 实例,如上面的r3,r4,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。

      3.Java的随机数都是通过算法实现的,Math.random()本质上属于Random()类。

      4.使用java.util.Random()会相对来说比较灵活一些。

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (331人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------