java - 有没有一种简单的方法来反转发生溢出的整数函数?

标签 java math binary integer-overflow

我正在尝试为 java.util.Random setSeed 和 next 函数创建一个反函数。本质上,我希望能够输入一个 long 值(在它被截断为 48 位之前)并返回一个种子或一系列种子,这将导致第一个 nextLong() 调用的该值。其相关源码如下:

setSeed(长种子)

seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)

下一个(整数位)

//this function is called by nextLong()
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)

问题似乎是由于第二部分而发生的,因为整数在乘法后溢出。因此,我不能简单地除掉常量,因为它最终会得到不同的结果,并且不会给我正确的种子。

我在二进制运算方面经验不是很丰富,并且想知道在除法时是否有一种方法可以解决这种溢出以获得正确的种子,而不必猜测真正大的乘法后数字实际上是什么。

最佳答案

想知道您是否真正想要的是一个随机数生成器,其中生成的第一个数字是一个特定值。

class MyRandom extends java.util.Random {
    long targetValue;
    long offset;
    int count=0;

    public MyRandom(long target) {
        this.targetValue = target;
   } 

   public long nextLong() {
        long rnd = super.nextLong();
        if(count++==0) {
            offset = target - rnd;
        }
        return rnd + offset;
   }
}

第一次调用 nextLong 时,它将设置偏移量并返回目标。 在所有调用中,它将返回移动固定量的随机数。这应该给出均匀分布。

关于java - 有没有一种简单的方法来反转发生溢出的整数函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56069450/

相关文章:

java - 摆脱方法中复制粘贴代码的方法

java - 只接收数据的 servlet 应该返回什么?

java - Spring 将 servlet contextConfigLocation 类视为路径,尽管 contextClass 正确

algorithm - 求所有可能子集的 MAX 和 MIN 之差之和

c++ - 从 8 位值中获取最高有效位

xml - 将包含 XML 文本的 base64 解码为 String 变量

C++ 二进制转十进制?

Java线程同步方法

javascript - 求虚点的距离

algorithm - 在网格中找到最少覆盖 1 的矩形