Java随机数使用总结

Java里随机数主要是通过Math.random方法和java.util.Random类来生成,当然也有借助System.currentTimeMillis()生成的,甚至如果你高兴,完全可以自己写个方法来生成。

一、java.util.Random类

1.伪随机数

Random类实现的是有规则的随机,也就是伪随机。Java随机数是通过线性同余公式产生的,也就是说通过一个复杂的算法生成的。只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使所谓的随机数更接近随机。但其实随机这个属性和算法本身就是矛盾的,通过真实随机事件取得的随机数才是真随机数。

2.伪随机数的不安全性

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

3.Java中随机数的种子

种子就是产生随机数的第一次使用值,机制是通过一个函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。以后产生的随机数都与前一个随机数有关。

Java中的随机数种子若不填写就会使用缺省值,即系统时间。不用种子的不随机性会增大。

4.java.util.Random类的构造方法

4.1 public Random()

该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。

4.2 public Random(long seed)

该构造方法可以通过给定的种子进行创建。

如下代码所示:

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

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

5.java.util.Random类的方法

Random类里维护了一个随机数生成器序列,类似一个数组,里面存着生成好的随机数。

  • int next(int bits):生成下一个伪随机数,参数bits是位数。
  • boolean nextBoolean():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值,生成true和false的值几率相等。
  • void nextBytes(byte[] bytes):生成随机字节并将其置于用户提供的 byte 数组中。
  • double nextDouble():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值,不包括1.0
  • float nextFloat():同上,但类型为Float
  • double nextGaussian():返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。
  • int nextInt():返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值,该值介于int的区间,也就是-231到231-1之间。
  • int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、该值介于[0,n)的区间,也就是0到n,不包括n。
  • long nextLong():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
  • void setSeed(long seed):使用单个 long 种子设置此随机数生成器的种子。

记住常用的几个即可。

6.Random类生成随机数使用示例

二、Math.random()

其实看源码就知道,该方法内部其实是调用的java.util.Random类的nextDouble()方法。

Math.random()源码截图

它返回的是0(包含)到1(不包含)之间的double值。使用方法如下:

若要获取int类型的整数,只需要将上面的结果转行成int类型即可。比如,获取[0, 100)之间的int整数。方法如下:

三、System.currentTimeMillis()

通过System.currentTimeMillis()来获取随机数。实际上是获取当前时间毫秒数,它是long类型。使用方法如下:

四、随机数实战示例

题目1:生成(-10,10)之间的保留小数点后两位数的随机数

解决方法:

1.java中随机数生成函数Random r=new Random(); r.nextFloat();//生成(0,1)之间的浮点型随机数。将上述随机数乘以10,得到生成(0,10)之间的随机数。
2.生成一个Boolean型的随机数用于控制数的正负:r.nextBoolean();
3.保留小数位数两位的方法:Math.floor(n*100+0.5)/100;得到的数为double型。

题目2:Java生成随机无重复随机数,使用ArrayList实现

题目3:java生成固定位数的密码随机数代码

题目4:Java生成带权重的随机数

0

发表评论

邮箱地址不会被公开。