[英]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.