Иницииране на втори случаен обект, използващ същото семе

С помощта на семена можете да накарате случаен обект да изплюва една и съща последователност от числа отново и отново. Но какво ще стане, ако искате да затворите приложението си, да го стартирате отново и да продължите да бълвате числа от мястото, където сте спрели? Просто инициирането на нов Random със същото начало започва последователността отново.

И така.. Освен поддържането на списък с всички повиквания, направени до Random и след това повторното им извикване, за да се върнете на същата позиция, има ли по-добър начин?

редакция: Zim-Zam посочи използването на Java Serialization за повторно иницииране на обекта, но не искам да добавя нито един 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