我是靠谱客的博主 霸气抽屉,最近开发中收集的这篇文章主要介绍建议28:不要随便设置随机种子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


随机种子,这个专业词什么意思?
import java.util.Random;
public class Test
{
public static void main(String[] args)
{
Random r = new Random(100);
for(int i = 0;i < 4; i++)
{
System.out.println("random==="+r.nextInt());
}
Random r1 = new Random(100);
for(int i = 0;i < 4; i++)
{
System.out.println("random1==="+r1.nextInt());
}
Random r2 = new Random(100);
for(int i = 0;i < 4; i++)
{
System.out.println("random2==="+r2.nextInt());
}
System.out.println("-----是否设置随机种子的分界线-----");
Random r3 = new Random();
for(int i = 0;i < 4; i++)
{
System.out.println("random3==="+r3.nextInt());
}
Random r4 = new Random();
for(int i = 0;i < 4; i++)
{
System.out.println("random4==="+r4.nextInt());
}
Random r5 = new Random();
for(int i = 0;i < 4; i++)
{
System.out.println("random5==="+r5.nextInt());
}
}
}


运行结果如下:
random===-1193959466
random===-1139614796
random===837415749
random===-1220615319
random1===-1193959466
random1===-1139614796
random1===837415749
random1===-1220615319
random2===-1193959466
random2===-1139614796
random2===837415749
random2===-1220615319
-----是否设置随机种子的分界线-----
random3===502672299
random3===-1713081807
random3===1448440381
random3===1198600908
random4===-1724426190
random4===1532525054
random4===1456105172
random4===-1072359493
random5===1238264579
random5===114908508
random5===292075850
random5===5008047

看到运行结果应该看出点端倪出来了,结果表明给随机数设置固定的随机种子100后,
不同的对象生成的随机数一样。而没有设置固定的随机种子不同的对象生成的随机数不一样。
再来看看这两个构造函数的源码:
无参构造函数:
public Random() {
// Note: Using identityHashCode() to be hermetic wrt subclasses.
setSeed(System.currentTimeMillis() + System.identityHashCode(this));
}

指定随机种子的构造函数:
public Random(long seed) {
setSeed(seed);
}

这就解释了为什么不同对象不指定随机种子生产的随机数会不同,随机种子不同而已。
计算机里面的随机数如下定义:
一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。
再看看java里面随机数具体是如何实现的,以整型为例子:
源码实现如下:
第一步:加工随机种子。
public synchronized void setSeed(long seed) {
this.seed = (seed ^ multiplier) & ((1L << 48) - 1);
haveNextNextGaussian = false;
}

第二步:通过此算法进行迭代产生随机数。
public int nextInt() {
return next(32);
}
public int nextInt(int n) {
if (n > 0) {
if ((n & -n) == n) {
return (int) ((n * (long) next(31)) >> 31);
}
int bits, val;
do {
bits = next(31);
val = bits % n;
} while (bits - val + (n - 1) < 0);
return val;
}
throw new IllegalArgumentException();
}
注:
nextInt(int n){……}

即此方法用于在区间[0,n)内随机产生一个整数。

到此应该能理解,java中随机数与随机种子两者之间的关系:
随机种子不同,产生的随机数不同。

随机种子相同,即使实例不同产生的随机数相同

现在能理解何为随机种子,就是用来产生随机数的一个基数,在此基础上通过一定算法,不断迭代产生随机数。

看完这建议后就知道为啥不要随意设置随机种子,我们用随机类Random,一般情况下就是为了获取随机数,因此不需要制定随机种子(当然特殊情况例外)。

转载于:https://my.oschina.net/thinkerfan/blog/98564

最后

以上就是霸气抽屉为你收集整理的建议28:不要随便设置随机种子的全部内容,希望文章能够帮你解决建议28:不要随便设置随机种子所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(97)

评论列表共有 0 条评论

立即
投稿
返回
顶部