java - 有没有办法从数字序列中生成种子?

标签 java random random-seed

例如,如果 java 生成伪随机序列:9 3 2 5 6 通过使用 23 作为种子,我怎样才能做相反的事情?即从序列 9 3 2 5 6 中获取 23

或者如何为特定序列分配种子?

如果有数据库就很容易做到——只需为序列分配一个随机键

INSERT INTO SEQUENCE_TABLE VALUES (RANDOM_KEY, SEQUENCE)

但是,如果不允许我使用数据库,是否有公式可以做这样的事情?

最佳答案

是的,对设计不当的伪随机数生成器的数字流进行逆向工程绝对容易,例如 Java 编程语言 (java.util.Random) 中的线性同余 PRNG 实现。

事实上,只要来自特定生成器的 两个 值,以及有关值出现顺序的信息,就可以预测整个流。

Random random = new Random();
long v1 = random.nextInt();
long v2 = random.nextInt();
for (int i = 0; i < 65536; i++) {
    long seed = v1 * 65536 + i;
    if (((seed * multiplier + addend) & mask) >>> 16) == v2) {
        System.out.println("Seed found: " + seed);
        break;
    }
}

这正是使用加密安全随机数生成器至关重要的原因,这些随机数生成器已经过整个社区的审查,适用于需要安全性的实现。

有更多关于逆向工程 PRNG 的信息,包括 java.util.Random here . ...

关于java - 有没有办法从数字序列中生成种子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8936891/

相关文章:

random - Lua非整数随机化

python - python和c++中类似的随机数生成但得到不同的输出

java - 如何在运行时创建多个模式连接?

java - final 变量可能没有初始化

java - 如何在 Spring boot 中对 MongoTemplate 的 Autowired 实例调用 MongoTemplate 函数

java - JVM 执行 Java 应用程序时,OS 的作用是什么?为什么我们需要操作系统?

algorithm - 填充区间的随机数生成器

javascript - 如何使用JavaScript生成固定长度的随机数?

java - 这段java代码有什么问题吗? (简单的随机数生成程序)

c++ - 如何在不同线程中随机播种