分析讲解Java Random类里的种子问题

网友投稿 275 2022-07-30


可以说在现在的计算机语言里面,以及普通用户这里,都是没有办法获得真正的 随机数的。真正的随机数现在也只有在量子计算机当中才有获得。

所以我们现在所说的随机数,也可以称为伪随机数,伪随机数是通过一种算法并且结合当下一个有规律其不断改变的数(比如时间)获得的结果。

我们将这种通过算法集合时间作为初始获得随机数的基准的数据称为种子。

java当中创建随机数的方式是有两种的:

第以种就是直接创建Random对象

Random random = new Random();

在底层就会调用这个方法来得到种子:

第二种就是将自己创建的种子传进去:

Random random = new Random(5);

在源码里我们可以直接看出种子的数据类型为long型,是长整形。

所以我们现在就有一种办法,在它最开始生成Random对象的时候,获得它生成的种子,然后将获得的种子又传入创建Random的对象当中。是不是就可以获得上面一模一样的随机数了?

先拿java语言来实现一下:

import java.util.Random;

public class Demo02 {

public static void main(String[] args) {

Random random = new Random(5);//在这将5作为种子传入

System.out.println("第一次调用:");

for (int i = 0; i < 5; i++) {

System.out.print(random.nextInt(10) + "\t");

//获得10以内的随机数(不包括10)

}

random.setSeed(5);//在这再将种子5传入Random的种子当中

System.out.println("\n第二次调用:");

for (int i = 0; i < 5; i++) {

System.out.print(random.nextInt(10) + "\t");

}

}

}

在这明显的看出,这个随机数是一点都不随机的。两次只要种子一样,就能返回相同的结果。

在这我再用python语言在实现一次这个功能(主要是java当中没有能调用输出当前种子的方法)。用pythonSzejqhTRDg有一个更好的理解。

在python里面我会更加详细的写清注释,详细不会很难理解不了的。

import random #导入random内库

x = random.getstate() # 获得当前random里的种子

print('第一次循环:') #输入语句

for i in range(5):

#for循环 for i in range(5) ===》 for (int i = 0; i < 5; i++)

#在python里面并没哟什么大括号去吧什么括起来,而是要注意锁定,一个锁定就是一个整体

print(random.randint(1, 10), end='\t')

#random.randint(1, 10)生成1~10(不包括10)的随机数,

# end='\t'表示当前print没有结束,还有一个制表符的键位,也就不换行了

print('\n第二次循环')

random.setstate(x)#将上面获得的种子再次传入进去

for i in range(5): #这里和上面一样,循环出5次

print(random.randint(1, 10), end='\t')


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot整合Mongodb实现增删查改的方法(springboot数据库增删改查)
下一篇:Java超详细讲解如何生成随机整数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~