Java——随机数(Random()函数)

Java中存在着两种Random函数:

一、java.lang.Math.Random

  Math.random()方法生成大于等于0.0且小于1.0的double型随机数(0.0<=Math.random<1.0),返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。举一个小例子:

public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            int r = (int) (Math.random() * 100);
            System.out.println("number is " + r);
        }
    }
}

注意:Math.Random()函数返回的是double类型的值,所以在要赋值给其他类型的变量的时候注意需要进行类型转换。
  此方法是完全同步的,可允许多个线程使用而不出现错误。但是,如果许多线程需要以极高的速率生成伪随机数,那么这可能会减少每个线程对拥有自己伪随机数生成器的争用。

二、java.util.Random

  1. java.util.Random类中实现的随机算法也是伪随机的,Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的机率均等;
  2. 相同种子数的Random对象,相同次数生成的随机数字是完全相同的。

Random()的两种构造方法:

  1. Random():以当前时间作为种子创建一个Random对象,并且采用线性同余法计算下一个随机数。
  2. Random(long seed):使用特定值作为种子创建一个Random对象。

提示:种子是一个用于初始化一个随机数字生成器的数字,如果两个Random对象有相同的种子,那它们会产生相同的数列。

方法 说明
nextInt( ) : int 返回一个随机的int值
nextInt(n : int): int 返回一个0到n(不包含n)之间的随机int类型的值
nextLong( ) : long 返回一个随机的long值
nextFloat( ) : float 返回一个0.0到1.0(不包含1.0F)之间的随机float类型的值
nextDouble( ) : double 返回一个0.0到1.0(不包含1.0)之间的随机double类型的值
nextBoolean( ) : boolean 返回一个随机的boolean值

 
举一个小例子:

import java.util.Random;

public class Demo {
    public static void main(String[] args) {
        Random random1 = new Random(100);
        System.out.print("random1: ");
        for (int i = 0; i < 10; i++) {
            System.out.print(random1.nextInt(1000) + " ");
        }
        System.out.println();
        Random random2 = new Random(100);
        System.out.print("random2: ");
        for (int i = 0; i < 10; i++) {
            System.out.print(random2.nextInt(1000) + " ");
        }
    }
}

它产生相同的int类型的随机数列:
结果

最后简单对比一下这两个随机函数的特点:
1. java.Math.Random()实际是在内部调用java.util.Random()的;
2. java.util.Random()在调用的时候可以实现和java.Math.Random()一样的功能,而且它有更多的调用方法,相对来说比较灵活;
3. 二者都是弱随机数,弱伪随机数PRNG实现 java.util.Random类,默认使用当前时间作为种子,并且采用线性同余法计算下一个随机数;强伪随机数RNG实现java.security.SecureRandom类,该类使用临时文件夹中大小,线程休眠时间等的值作为随机数种子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章