[英]Is there a simple way to invert an integer function that experiences overflow?
我正在尝试为java.util.Random setSeed和next函数创建一个逆函数。 本质上,我希望能够输入一个长值(在将其截断为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时,它将设置偏移量并返回目标。 在所有通话中,它将返回随机数字,并偏移固定数量。 这应该给出均匀的分布。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.