Java⽣成随机数
Java中常⽤的两种产⽣随机数的⽅法⼀、java.lang.Math类中的random()⽅法;
调⽤这个Math.random()函数能够返回带正号的double值,该值⼤于等于0.0且⼩于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是⼀个伪随机选择的数,在该范围内(近似)均匀分布。
第⼀次调⽤该⽅法时,它将创建⼀个新的伪随机数⽣成器,与以下表达式完全相同new java.util.Random
之后,新的伪随机数⽣成器可⽤于此⽅法的所有调⽤,但不能⽤于其他地⽅。
此⽅法是完全同步的,可允许多个线程使⽤⽽不出现错误。但是,如果许多线程需要以极⾼的速率⽣成伪随机数,那么这可能会减少每个线程对拥有⾃⼰伪随机数⽣成器的争⽤。
⼆、java.util.Random类;
1、java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机⽣成数字;2、相同种⼦数的Random对象,相同次数⽣成的随机数字是完全相同的;
3、Random类中各⽅法⽣成的随机数字都是均匀分布的,也就是说区间内部的数字⽣成的⼏率均等;
下⾯Random()的两种构造⽅法
1.Random():创建⼀个新的随机数⽣成器。
2.Random(long seed):使⽤单个 long 种⼦创建⼀个新的随机数⽣成器。
//获取当前时间的毫秒数作为随机数种⼦long t = System.currentTimeMillis();
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.⽣成[0,1.0)区间的⼩数:double d1 = r.nextDouble();2.⽣成[0,5.0)区间的⼩数:double d2 = r.nextDouble() * 5;
3.⽣成[1,2.5)区间的⼩数:double d3 = r.nextDouble() * 1.5 + 1;4.⽣成-231到231-1之间的整数:int n = r.nextInt();5.⽣成[0,10)区间的整数:int n2 = r.nextInt(10);//⽅法⼀
n2 = Math.abs(r.nextInt() % 10);//⽅法⼆
前⾯曾讲到过构造Random对象的时候指定种⼦的问题,到底指定种⼦有什么作⽤呢,这⾥直接⽤代码例⼦来做说明:
在定义的时候分别指定了相同的种⼦之后,在分别⽤r1和r2去[0,30)的随机数,结果编译执⾏后悔发现结果都是呈现AABB型的,说明r1和r2取的随机数是⼀模⼀样的(下图为实验截图)。
如果我改动代码,改成下⾯这样:
再编译输出后,就再也不会得到AABB型的结果,根据代码的区别,就可以知道指定种⼦数,和不指定种⼦数的区别在于哪⾥了。
最后再来简单对⽐⼀下这两个随机函数到底的特点:
1.java.Math.Random()实际是在内部调⽤java.util.Random()的,它有⼀个致命的弱点,它和系统时间有关,也就是说相隔时间很短的两个random⽐如:double a = Math.random();double b = Math.random();
即有可能会得到两个⼀模⼀样的double。
2.java.util.Random()在调⽤的时候可以实现和java.Math.Random()⼀样的功能,⽽且他具有很多的调⽤⽅法,相对来说⽐较灵活。所以从总体来看,使⽤java.util.Random()会相对来说⽐较灵活⼀些。
reference:
https://www.cnblogs.com/uncle-box/p/5918743.html