用于在两台机器上创建java Random的种子的相同值

dam*_*mon 7 java random

如果我在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)

如果我在我的计算机上多次运行,我会得到相同的数字集......但是假设有人设法获得我使用的秘密种子值(通过猜测或从存储它的秘密位置)并运行此代码他的机器,他会得到同样的数字吗?

Stu*_*etz 8

是的,指定生成随机数的方式的合同在两种情况下都是相同的,因此如果给出相同的种子,它们将产生相同的数字序列.实现Random必须使用规定的算法,以确保这种情况.更准确的方式(来自相关文档)是:

如果使用相同的种子创建两个Random实例,并且对每个实例都进行相同的方法调用序列,则它们将生成并返回相同的数字序列.为了保证此属性,为Random类指定了特定的算法.为了Java代码的绝对可移植性,Java实现必须使用此处显示的所有算法用于Random类.但是,Random类的子类允许使用其他算法,只要它们遵守所有方法的一般合同即可.