当前位置: 首页 > 知识库问答 >
问题:

用getInt(int n)方法获取Java的RNG种子

魏硕
2023-03-14

我对Java RNG的工作方式很感兴趣。我读到过使用getLong()方法和getInt()以及两个值非常容易。我对使用getInt(int n)获得种子感兴趣,该种子知道n的值。

由于getInt(n)通常使用val=bits%n;并重复使用,直到bits-val+(n-1)>=0)为bitsnext(31)所以val==bits(mod n)

我已经测试了一个bruteforce来测试所有可能的数字对,这些数字与初始的数字是全等的,但这对计算机来说是非常长和困难的。

关于如何以有效的方式获得种子,还有其他的想法吗?

共有1个答案

闻人宜
2023-03-14

您应该能够对此使用反射:

Random r = new Random(1);

Field f;
try {
    f = r.getClass().getDeclaredField("seed");
    f.setAccessible(true);
    AtomicLong seed = (AtomicLong) f.get(r);
    System.out.println("seed: " + seed);

    f = r.getClass().getDeclaredField("mask");
    f.setAccessible(true);
    Long mask = (Long) f.get(r);
    System.out.println("mask: " + mask);

    f = r.getClass().getDeclaredField("multiplier");
    f.setAccessible(true);
    Long multiplier = (Long) f.get(r);
    System.out.println("multiplier: " + multiplier);


    long initialSeed = (seed.longValue() ^ multiplier);
    System.out.println("restored initial seed: " + initialSeed);
} catch (NoSuchFieldException e1) {
} catch (SecurityException e2) {
} catch (IllegalAccessException e3) {
} catch (IllegalArgumentException e4) {
}   

我的计算机上的输出:

seed: 25214903916
mask: 281474976710655
multiplier: 25214903917
restored initial seed: 1

设置seed时,将置乱该值:

public Random(long seed) {
    if (getClass() == Random.class)
        this.seed = new AtomicLong(initialScramble(seed));
    else {
        // subclass might have overriden setSeed
        this.seed = new AtomicLong();
        setSeed(seed);
    }
}

private static long initialScramble(long seed) {
    return (seed ^ multiplier) & mask; // (seed XOR multiplier) AND mask
}
private static final long mask = (1L << 48) - 1;
private static final long multiplier = 0x5DEECE66DL;
Random r = new Random((1L << 48)-1);

seed: 281449761806738
mask: 281474976710655
multiplier: 25214903917
restored initial seed: 281474976710655
Random r = new Random((1L << 48));

seed: 25214903917
mask: 281474976710655
multiplier: 25214903917
restored initial seed: 0
 类似资料:
  • 本文向大家介绍Java获取随机数的3种方法,包括了Java获取随机数的3种方法的使用技巧和注意事项,需要的朋友参考一下 主要介绍了Java获取随机数的3种方法,主要利用random()函数来实现 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1))例: 从1到10的int型随数 方法2 获得随机数 通过java.Math包的random方法得到1-10的int随机数

  • 问题内容: 提前道歉,提出一个(看似显而易见的)问题。我没有在线找到答案,所以我想问一下: Java的Util.Random是否独立于平台? 例如,是否将在* nix和Windows系统中产生完全相同的随机数序列? 问题答案: 从文档: 如果使用相同的种子创建了两个实例,并且对每个实例进行了相同的方法调用序列,则它们将生成并返回相同的数字序列。为了保证此属性,将为class指定特定的算法。为了实现

  • 本文向大家介绍java获取各种路径的基本方法,包括了java获取各种路径的基本方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java获取不同路径的方法,供大家参考,具体内容如下 下面赋上代码对应的文件路径 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Java 获取当前系统时间的三种方法,包括了Java 获取当前系统时间的三种方法的使用技巧和注意事项,需要的朋友参考一下 准备工作:   方式一:   方式二:   方式三: 以上就是Java 获取当前系统时间的三种方法的详细内容,更多关于Java 获取系统时间的资料请关注呐喊教程其它相关文章!

  • 本文向大家介绍获取用键盘输入常用的两种方法?相关面试题,主要包含被问及获取用键盘输入常用的两种方法?时的应答技巧和注意事项,需要的朋友参考一下 方法1:通过 Scanner 方法2:通过 BufferedReader

  • 本文向大家介绍java 获取字节码文件的几种方法总结,包括了java 获取字节码文件的几种方法总结的使用技巧和注意事项,需要的朋友参考一下 java 获取字节码文件的几种方法总结 在本文中,以Person类为例,将分别演示获取该类字节码文件的三种方式, 其具体思想及代码如下所示: 以上就是java 获取字节码文件的几种方法,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家