您的位置:首页 > 编程语言 > Java开发

Java中的random函数

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

java一共存在两种random函数。

一、java.lang.math.random

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





可以看出进行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)
等效于:

[code]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。

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



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

然后改一下,如下所示:



序列不一样了。

最后总结一下:

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()会相对来说比较灵活一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: