Обратный инженер Генератор случайных чисел - PullRequest
0 голосов
/ 19 мая 2018

Как мне выполнить обратный инжиниринг этого генератора случайных чисел, чтобы он возвращал начальное значение "123456" из сгенерированного случайного значения?

public class calcus {
  public static void main(String[] args)  {
    int count = 0;
    StringBuilder sb = new StringBuilder();
    Random r = new Random(123456);
    while (count < 7) {
        count++;
        sb.append(r.nextInt(27)).append(",");
    }
    String[] reverseNumber= sb.toString().split(",");
    System.out.println(Arrays.toString(reverseNumber)); // [9, 11, 19, 16, 19, 4, 15]            
  }
}

1 Ответ

0 голосов
/ 19 мая 2018

Буквально, вам не нужно перепроектировать класс Random.

  • Исходный код опубликован для всеобщего обозрения.(Например, Google для «java.util.Random source» ...)

  • Алгоритмы, которые он использует, описаны в javadocs достаточно подробно, чтобы вы могли переопределить его.Даже алгоритм для установки начального числа.

Но если вы спрашиваете, можете ли вы запустить случайную последовательность в обратном порядке, чтобы восстановить начальное число, вам нужно будет тщательно изучить код и разработатьобратная функция для LCG.Но я не уверен, что этого будет достаточно, поскольку nextInt(int) и даже nextInt() не возвращают все 48-битное состояние генератора.

Чтобы обойти это, вам, возможно, понадобится сделать "мерзкое отражение", чтобы извлечь состояние.И если вы собираетесь это сделать, исходный код показывает, что класс Random записывает значение начального числа.Таким образом, вы можете просто извлечь его напрямую ... таким же образом.

(Как? Найдите вопрос и ответ, объясняющий, как получить доступ к закрытому полю с помощью отражения.)


...