Инициация второго случайного объекта с использованием того же начального числа

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

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

edit: Zim-Zam указал на использование сериализации Java для повторной инициализации объекта, но я не хочу добавлять ни одного объекта Java в свои файлы сохранения, которые в противном случае полностью представляют собой XML.


person Caustic    schedule 02.05.2013    source источник
comment
Если вы не возражаете, если я спрошу, зачем вам это? Если ваша программа была инициирована с уникальным (плюс-минус) начальным числом в первый раз, обычно нет разницы в уровне случайности при продолжении предыдущей случайной последовательности и запуске совершенно новой.   -  person Cthulhu    schedule 03.05.2013
comment
Так что один пользователь будет иметь такой же опыт работы с моим случайно сгенерированным контентом, как и другой пользователь, несмотря на его использование.   -  person Caustic    schedule 03.05.2013


Ответы (3)


Вы можете сериализовать свой объект Random с помощью ObjectOutputStream, чтобы сохранить его состояние; когда вы снова запустите свою программу, десериализуйте ее с помощью ObjectInputStream, и ваш Random начнется с того места, где он остановился.

Кроме того, скопируйте и вставьте исходный код Java Random в свой собственный MyRandom генератор; это даст вам доступ к внутренней работе генератора, чтобы вы могли сохранять и восстанавливать его состояние.

person Zim-Zam O'Pootertoot    schedule 02.05.2013
comment
Хотя это простой ответ, я действительно не хочу использовать один сериализованный объект Java в своей структуре данных, которая в остальном полностью основана на XML. Я добавлю это к вопросу. - person Caustic; 03.05.2013
comment
Еще одна хорошая идея, но посмотрите мой ответ для чего-то более простого. - person Caustic; 03.05.2013

Хорошо. Я считаю, что нашел решение, которое выдержало несколько тестов.

Расширение Random дает вам доступ к защищенному методу next(int). С помощью этого шага случайная позиция. Таким образом, переопределяя методы nextFloat/nextInt/etc и увеличивая счетчик. Я могу инициировать новый объект Random, используя то же начальное число и число, и вызвать next() достаточное количество раз, чтобы догнать предыдущий экземпляр. Кажется, работает хорошо и является хорошим простым решением.

Спасибо тем, кто ответил/комментировал.

person Caustic    schedule 02.05.2013

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

Random mySaveableRandom = new Random();

long bookmark() {
    long bookmark = mySaveableRandom.nextLong();
    mySaveableRandom.setSeed(bookmark);
    return bookmark;
}
...
void startFrom(long bookmark) {
    mySaveableRandom.setSeed(bookmark);
}
person MilesHampson    schedule 10.03.2017