Есть ли простой способ инвертировать целочисленную функцию, которая испытывает переполнение? - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь создать обратную функцию для java.util.Random setSeed и следующих функций.По сути, я хочу иметь возможность вводить длинное значение (до его усечения до 48 бит) и возвращать начальное или семейство начальных значений, которое приведет к этому значению для первого вызова nextLong ().Соответствующий исходный код приведен ниже:

setSeed (long seed)

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

next (целые биты)

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

Проблема возникает из-за второйчасть, так как целое число переполняется после умножения.Из-за этого я не могу просто разделить константу, так как это приведет к другому результату и НЕ даст мне правильное начальное число.

Я не очень разбираюсь в бинарных операциях, и мне было интересно,есть способ учесть это переполнение при делении для получения правильного начального числа без необходимости угадывать, каково было действительно большое число после умножения.

1 Ответ

0 голосов
/ 11 мая 2019

Интересно, действительно ли вам нужен генератор случайных чисел, где первое сгенерированное число является конкретным значением.

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 он установит смещение и вернет цель.На все вызовы возвращается случайное число, сдвинутое на фиксированную сумму.Это должно дать равномерное распределение.

...