Java 有没有一种简单的方法可以反转出现溢出的整数函数?
我正在尝试为java.util.Random setSeed和next函数创建一个反向函数。本质上,我希望能够输入一个长值(在它被截断为48位之前),并返回一个种子或种子家族,该种子或种子家族将为第一个nextLong()调用生成该值。其相关源代码如下: 固定种子(长种子)Java 有没有一种简单的方法可以反转出现溢出的整数函数?,java,math,binary,integer-overflow,Java,Math,Binary,Integer Overflow,我正在尝试为java.util.Random setSeed和next函数创建一个反向函数。本质上,我希望能够输入一个长值(在它被截断为48位之前),并返回一个种子或种子家族,该种子或种子家族将为第一个nextLong()调用生成该值。其相关源代码如下: 固定种子(长种子) seed=(seed^0x5deec66dl)&((1L想知道您真正想要的是一个随机数生成器,其中生成的第一个数字是一个特定的值 class MyRandom extends java.util.Random { l
seed=(seed^0x5deec66dl)&((1L想知道您真正想要的是一个随机数生成器,其中生成的第一个数字是一个特定的值
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时,它将设置偏移量并返回目标。
在所有调用中,它将返回按固定数量移位的随机数。这将提供一个统一的分布。想知道您真正想要的是一个随机数生成器,其中生成的第一个数字是一个特定的值
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时,它将设置偏移量并返回目标。
在所有调用中,它将返回按固定数量移位的随机数。这将提供一个均匀的分布。它不仅溢出,而且截断的结果还有其16个最高有效位被屏蔽。可以计算产生特定长
的种子作为第一个结果,但这取决于d关于nextLong()
计算的更完整细节。看看,它提出了一个非常类似的问题。nextLong()
使用两个对底层LCG的连续调用中的32位,只从每个状态中取中间的32位。这可能并不“难”从加密的角度来解决,但我也不认为这是一个微不足道的问题。可能更多的是一个数学问题,如果你在这里没有得到答案,请尝试math.stackexchange.com。它不仅溢出,而且截断的结果还有它的16个最高有效位被屏蔽。计算一个种子可能会产生一个特定的long
作为第一个结果,但这将取决于nextLong()
计算的更完整细节。请看,它提出了一个非常类似的问题。nextLong()
使用两个对底层LCG的连续调用中的32位,只从每个状态中取中间的32位。这可能并不“难”在加密的意义上解决,但我也不认为这是一个微不足道的问题。可能更多的是一个数学问题,如果你在这里没有得到答案,请尝试math.stackexchange.com。谢谢,但是不,我想要一种方法来控制内置于java.util.random中的RNG的第一个输出。谢谢,我想要一种方法来控制第一个输出y表示内置在java.util.Random中的RNG
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;
}
}