Java 产生随机数的三种方式

来源:互联网 发布:定性与定量数据区别 编辑:程序博客网 时间:2024/06/13 21:34

Java产生随机数的三种方式

在Java中,随机数的概念从广义上讲,有三种。
1、通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。
2、通过Math.random()方法返回一个0到1之间的double值。
3、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。

Math.random()方法

Math.random()方法是 Java 的一个静态方法,返回一个0到1之间,前闭后开区间的double值。

(int)(Math.random()*10) 返回0到9的随机整数。
(int)(Math.random()*n) 返回0到n的随机整数。
(int)(Math.random()*100)+1 返回1到100之间的随机整数,前面返回0到99之间的随机数,加1就成了1到100之间的随机数。

Random类

Random 类是 Java 的 util 包中的一个类。

一、Random类使用说明

  1. Random类使用的根本策略是分带种子和不带种子的Random的实例。
    通俗说,两者的区别是:带种子的,每次运行生成的结果都是一样的。
    不带种子的,每次运行生成的都是随机的,没有规律可言。
  2. 创建不带种子的Random对象
    Random random = new Random();
    使用一个和当前系统时间对应的相对时间有关的数字作为种子数。
  3. 创建带种子的Random对象有两种方法:
    1) Random random = new Random(10);
    2) Random random = new Random();random.setSeed(10);
    种子的作用是什么?
      种子就是产生随机数的第一次使用值,机制是通过一个函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。以后产生的随机数都与前一个随机数有关。
    举例:
      Random r =new Random(100);
      System.out.println(r.nextInt(20));
    100是种子,r.nextInt(20)中的20是随机数的上限,产生的随机数为0-20的整数,不包括20,种子数只是随机算法的起源数字,和生成的随机数字的区间没有任何关系。
    初始化时100并没有起直接作用(注意:不是没有起作用)。

二、下面是Java.util.Random类的方法摘要

  1. protected int next(int bits):生成下一个伪随机数。
  2. boolean nextBoolean():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。
  3. void nextBytes(byte[] bytes):生成随机字节并将其置于用户提供的 byte 数组中。
  4. double nextDouble():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值。
  5. float nextFloat():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。
  6. double nextGaussian():返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。
  7. int nextInt():返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
  8. int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。
  9. long nextLong():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
  10. void setSeed(long seed):使用单个 long 种子设置此随机数生成器的种子。

总结:
1. 同一个种子,生成N个随机数,当你设定种子的时候,这N个随机数是什么已经确定。相同次数生成的随机数字是完全相同的。
2. 如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。
3. Java的随机数都是通过算法实现的,Math.random()本质上属于Random()类。
4. 使用java.util.Random()会相对来说比较灵活一些,可以产生正态、高斯、均匀分布的随机数。

为什么说Java中的随机数都是伪随机数?什么是伪随机数?

  1. 伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机。
  2. 只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机。
      (随机这个属性和算法本身就是矛盾的)
  3. 通过真实随机事件取得的随机数才是真随机数。

Java随机数产生原理

Java的随机数产生是通过线性同余公式产生的,也就是说通过一个复杂的算法生成的。

伪随机数的不安全性

Java自带的随机数函数是很容易被黑客破解的,因为黑客可以通过获取一定长度的随机数序列来推出你的seed,然后就可以预测下一个随机数。

原创粉丝点击