如果我在java程序中对Random使用相同的种子值并在两台不同的机器上运行它,我会得到相同的数字集吗?
例如
long seed = 123L;//may be taken from some database or something
java.util.Random ran = new java.util.Random(seed);
int ret = 0;
for (int i= 0; i< 10; i++){
ret = ran.nextInt(1000);
System.out.println("ret="+ret);
}
Run Code Online (Sandbox Code Playgroud)
我总是得到
ret=782
ret=450
ret=176
ret=789
ret=795
ret=657
ret=834
ret=837
ret=585
ret=453
Run Code Online (Sandbox Code Playgroud)
如果我在我的计算机上多次运行,我会得到相同的数字集......但是假设有人设法获得我使用的秘密种子值(通过猜测或从存储它的秘密位置)并运行此代码他的机器,他会得到同样的数字吗?
是的,指定生成随机数的方式的合同在两种情况下都是相同的,因此如果给出相同的种子,它们将产生相同的数字序列.实现Random必须使用规定的算法,以确保这种情况.更准确的方式(来自相关文档)是:
如果使用相同的种子创建两个Random实例,并且对每个实例都进行相同的方法调用序列,则它们将生成并返回相同的数字序列.为了保证此属性,为Random类指定了特定的算法.为了Java代码的绝对可移植性,Java实现必须使用此处显示的所有算法用于Random类.但是,Random类的子类允许使用其他算法,只要它们遵守所有方法的一般合同即可.