java基础_函数Math.random()和Random的使⽤及区别我是野猪。
⾸先Math.random()是令系统随机选取⼤于等于 0.0 且⼩于 1.0 的伪随机 double 值,是Java语⾔常⽤代码。例如:
Number=Math.random()*3+1,设置⼀个随机1到4的变量;Random 类有含参数和不含参数的构造;其中不含参的构造⽅法每次都是使⽤当前系统时间作为种⼦,⽽含参构造是使⽤⼀个固定值(参数)作为种⼦(种⼦也就是Random⽣成随机数时使⽤的参数)。每次使⽤时先创建⼀个Random对象,也叫随机数⽣成器,然后调⽤**()⽅法获取数值。
我们存在的疑问有以下⼏个:
1.Math.random()使⽤⽅式;
2.Random的使⽤⽅式,有参和⽆参的区别,使⽤有参即种⼦时有何效果;
Int(n) n的作⽤;
4.Math.random()和Random之间的关系;
具体的详解,将会有以下代码来辅助解释。
1.Math.random()使⽤⽅式:
System.out.println("通过Math.random产⽣的随机数列");
for (int j = 0; j < 8; j++) {
System.out.println(Math.random() + ",");
}
输出结果是:
通过Math.random产⽣的随机数列:
0.8168659689075662,
0.1840193556566645,
0.9640563597086169,
0.7561812266766494,
0.8666184559231468,
0.13803676499296735,
0.599042620405967,
0.11271421452403096,
产⽣的是double随机数列。
2.Random的使⽤⽅式:
⾸先产⽣的2个随机数⽣成器即Random对象,种⼦是100,代码如下:
for (int i = 0; i < 2; i++) {
//创建2个随机数⽣成器
Random random = new Random(100);
for (int j = 0; j < 3; j++) {
/
/每个随机数⽣成器产⽣8个数
//n 要返回的随机数的边界也就是随机数的范围是0-50之间的整数
System.out.Int(50) + ",");
}
System.out.println("");
}
输出结果竟然⼀直:
15,
0,
24,
15,
0,
24,
由此可见,当使⽤有参数的构造创建随机数⽣成器然后⽣成随机数序列的时候,产⽣的随机数是种⼦经过计算得到的,具有相同种⼦数的Random对象⽣成的随机数序列相同。其次通过⽆参构造创建Random对象,其本质是也是种⼦,只不过种⼦不是具体的数值,⽽是系统当前的时间,也因此创建的随机数是不相同的。
代码如下:
System.out.println("Random不含种⼦参数\n");
for (int i = 0; i < 2; i++) {
//创建2个随机函数⽣成器
Random random = new Random();
for (int j = 0; j < 3; j++) {
/
/每个随机数⽣成器产⽣3个数
System.out.Int(50) + ",");
}
System.out.println("");
}
输出结果:
Random不含种⼦参数
36,
7,
15,
33,
17,
13,
显然产⽣的随机数是不同的。
Int (50)代表⽣成的随机数范围是0-50,不会越界。
我们进⾏源码分析,关于Random类,其构造源码如下:
/**
* Creates a new random number generator. This constructor sets
* the seed of the random number generator to a value very likely
* to be distinct from any other invocation of this constructor.
*/
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
翻译⼤致:创建⼀个随机数⽣成器,此构造⽅法设置此随机数⽣成器的种⼦是独⼀⽆⼆的;
点击this,跳转到对应的有参构造中,显然由代码可以看出种⼦的⽣成和当前时间有关系,也因此这样⽣成的种⼦是独⼀⽆⼆的。
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}nextint()方法
}
通过⽐较我们就可以得出结论:
①随机数是种⼦经过计算⽣成的。
②Random类中不含参的构造函数每次都是使⽤当前时间作为种⼦,随机性更强;⽽含参数的构造函数是伪随机的,更有可预见性。
③具有相同种⼦值的Random对象⽣成的随机数相同;种⼦值不同,产⽣的随机数不再⼀致。
3.Math.random()和Random之间的关系:
查看源码:
public final class Math {
。。。。。省略
public static double random() {
return Double();
}
。。。。。省略
private static class NoImagePreloadHolder {
private static final Random INSTANCE = new Random();
}
}
从Math类的源码就能看出Math.random()内部调⽤的⽅法就是Random类中的nextDouble()⽅法,此刻也就明确了⽂章⼀开始
Math.random()返回的是double类型值。
总结:
java.util.Random类中
①随机数是种⼦经过计算⽣成的。
②Random类中不含参的构造函数每次都是使⽤当前时间作为种⼦,随机性更强;⽽含参数的构造函数是以参数为种⼦产⽣的伪随机数,更有可预见性。
③具有相同种⼦值的Random对象⽣成的随机数相同;种⼦值不同,产⽣的随机数不再⼀致。
Math.random()⽅法中内部调⽤的⽅法就是Random类中的nextDouble()⽅法。
如有错误,请⼤家及时指出。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论