Java中存在着两种Random函数:
一、java.lang.Math.Random:
调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机数,在该范围内(近似)均匀分布。
1 Math.Random()函数产生的随机数:0.99567753556435882 Math.Random()函数产生的随机数:0.34524543576860293 Math.Random()函数产生的随机数:0.94892353730497344 Math.Random()函数产生的随机数:0.5280729775003039
二、java.util.Random:
Random类是伪随机数的产生器。之所以称之为伪随机数是因为它们是简单的均匀分布序列。Random定义了下面的构造函数。
- Random()
- Random(long seed)
第一种形式创建一个使用当前时间作为起始值或称为初始值的数字发生器。第二种形式允许人为指定一个初值。
如果用初值初始化了一个Random对象,就对随机序列定义了起始点。如果用相同的初值初始化另一个Random对象,将获得同一随机序列。如果要生成不同的序列,应当指定不同的初值。实现这种处理的最简单的方法是使用当前时间作为产生Random对象的初值。这种方法减少了得到相同序列的可能性。
方法 | 描述 |
boolean nextBoolean | 返回下一个布尔(boolean)随机数 |
void nextBytes(byte vals[]) | 用随机产生的值填充vals |
double nextDouble() | 返回下一个双精度(double)随机数 |
float nextFloat() | 返回下一个浮点(float)随机数 |
double nextGaussian() | 返回下一个高斯随机数 |
int nextInt() | 返回下一个整型(int)随机数 |
int nextInt(int n) | 返回下一个介于0和n之间的整型(int)随机数 |
long nextLong() | 返回下一个长整型(long)随机数 |
void setSeed(long newSeed) | 将由newSeed指定的值作为种子值(也就是随机数产生器的开始值) |
正如你能看到的,从Random对象中可以提取七种类型的随机数。从nextBoolean()方法中可以获得随机布尔数。通过调用nextBytes()方法获得随机字节数。通过调用nextInt()方法可以获得随机整型数。通过调用nextLong()方法可以获得均匀分布的长整型随机数。通过调用nextFloat()和nextDouble()方法可以分别得到在0.0到1.0之间的,均匀分布的float和double随机数。最后,调用nextGaussian()方法返回中心在0.0,标准偏差为1.0的double值,这就是著名的钟形曲线。
三、Random类使用示例
Random r = new Random()
- 生成[0, 1.0)区间的小数:double d1 = r.nextDouble();直接使用nextDouble方法获得。
- 生成[0, 5.0)区间的小数:double d2 r.nextDouble()*5;因为nextDouble方法生成的数字区间是[0, 1.0),将该区间扩大5倍即是要求的区间。同理,生成[0, d)区间的随机小数,d为任意正的小数,则只需要将nextDouble方法的返回值乘以d即可。
- 生成[1, 2.5)区间的小数:double d3 = r.nextDouble()*1.5+1;生成[1, 2.5)区间的随机小数,则只需要首先生成[0, 1.5)区间的随机数字,然后将生成的随机数区间加1即可。同理,生成任意非从0开始的小数区间[d1, d2)范围的随机数字(其中d1不等于0),则只需要首先生成[0, d2-d1)区间的随机数字,然后将生成的随机数区间加上d1即可。
- 生成任意整数:int n1 = r.nextInt();直接使用nextInt方法即可。
- 生成[0, 10)区间的整数:int n2 = r.nextInt(10) /n2 = Math.abs(r.nextInt()%10) ;前面两种方法均可生成[0, 10)区间的整数。第一种实现使用Random类中的nextInt(int n)方法直接实现。第二种实现中,首先调用nextInt()方法生成一个任意的int数字,该数字和10取余以后生成的数组区间为(-10, 10),然后再对该区间求绝对值,则得到的区间就是[0, 10)了。同理,生成任意[0, n)区间的随机整数,都可以使用如下代码:int n2 = r.nextInt(n); n2 = Math.abs(r.nextInt()%n)
- 生成[0, 10]区间的整数:int n3 = r.nextInt(11);n3 = Math.abs(r.nextInt()%11)相对于整数区间,[0, 10]区间和[0, 11)区间等价,所以即生成[0, 11)区间的整数。
- 生成[-3, 15)区间的整数:int n4 = r.nextInt(18)-3; n4 = Math.abs(r.next()%18)-3;生成非从0开始区间的随机整数,可以参看上面非从0开始的小数区间实现原理的说明。