天天看点

JAVA中random头文件,Java中的random函数

最近写一个小程序的时候,用到了java 的random函数。于是详细地看了一下API文档,也去网上搜了一下相关资料。在这里对其做一个总结。

java一共存在两种random函数。

一、java.lang.math.random

该方法返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。也就是左闭右开的区间。借助下面的代码理解:

JAVA中random头文件,Java中的random函数
JAVA中random头文件,Java中的random函数

可以看出进行10次循环,0、1、2在此区间均匀分布。

需要注意的一点是Math.random返回的是double类型的值,需要其它类型的随机数时需要进行类型转化。

二、java.lang.util.random

对于API文档中的描述,总结起来就是:

1、该方法是一个伪随机的随即算法,根据一定的规则生成随机数,基于给定的种子数,生成给定区间的伪随机数。

2、生成的随机数在区间内近似均匀分布,也就是每个数字出现的几率相同。

3、随机数跟种子数有关,对于相同种子数的两个随机变量,它们生成的随机序列是一样。这一点在下文会有验证。

这里的random有两个构造方法:

random()--创建一个新的随机数生成器。此构造方法将随机数生成器的种子设置为某个值,该值与此构造方法的所有其他调用所用的值完全不同。

random(long seed)--使用单个long 种子创建一个新的随机数生成器。该种子是伪随机数生成器的内部状态的初始值,该生成器可通过方法next(int) 维护。 调用new Random(seed) 等效于:

Random rnd = new Random();

rnd.setSeed(seed);

无参构造器会以与默认的系统时间相关的数字作为种子,以保证“该值与此构造方法的所有其他调用所用的值完全不同”。

有参构造器会使用给定的合法的参数。

需要注意:使用给定的合法种子时,种子数只是随机数的起源数字,跟生成随机数的范围区间无关,区间是由nextInt(int m)中的参数m确定。

Random rand =new Random();

int i;

i=rand.nextInt(100);

参数30开始并没有起作用(注意:并非不起作用),

nextInt(100)中的参数100规定了随机数的范围为0-100,可以取0,取不到100。

至于给定种子数有什么作用,下面以例子来解释一下。

JAVA中random头文件,Java中的random函数

由图可见,种子数一样时,两个随机数序列是一样的。

然后改一下,如下所示:

JAVA中random头文件,Java中的random函数

序列不一样了。

最后总结一下:

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()会相对来说比较灵活一些。

继续阅读