可以说在现在的计算机语言里面,以及普通用户这里,都是没有办法获得真正的 随机数的。真正的随机数现在也只有在量子计算机当中才有获得。
所以我们现在所说的随机数,也可以称为伪随机数,伪随机数是通过一种算法并且结合当下一个有规律其不断改变的数(比如时间)获得的结果。
我们将这种通过算法集合时间作为初始获得随机数的基准的数据称为种子。
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);
System.out.println("第一次调用:");
for (int i = 0; i < 5; i++) {
System.out.print(random.nextInt(10) + "\t");
}
random.setSeed(5);
System.out.println("\n第二次调用:");
for (int i = 0; i < 5; i++) {
System.out.print(random.nextInt(10) + "\t");
}
}
}
在这明显的看出,这个随机数是一点都不随机的。两次只要种子一样,就能返回相同的结果。
在这我再用python语言在实现一次这个功能(主要是java当中没有能调用输出当前种子的方法)。用python有一个更好的理解。 在python里面我会更加详细的写清注释,详细不会很难理解不了的。
import random
x = random.getstate()
print('第一次循环:')
for i in range(5):
print(random.randint(1, 10), end='\t')
print('\n第二次循环')
random.setstate(x)
for i in range(5):
print(random.randint(1, 10), end='\t')
这篇博客关于Random种子的问题,就说到这了,大家有什么疑问,欢迎大家在评论区讨论。
|