我正在尝试为 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/