Скопируйте переменную экземпляра типа java.util.Random, чтобы создать объект в том же состоянии
Я реализуюимитация отжига (SA) алгоритм, где мне нужно копировать состояния (например, чтобы запомнить лучшее решение до сих пор).
Я реализовал метод копирования, так как не рекомендуется использовать Javaclone()
.
SA - это эвристический алгоритм, поэтому следующий шаг определяется случайным образом. Это делается с помощьюRandom
объект, который я тоже хочу скопировать.
Хотя это не требуется алгоритмом, я хочу, чтобы копия имела точно такое же состояние. Но это только в том случае, если я делаю «копию» сразу после создания объекта и инициализирую его тем же начальным числом.
Но если я выполню некоторые операции случайным образом перед процессом копирования, внутреннее состояние (то есть начальное число)Random
объект изменяется и копия ведет себя по-разному.
Итак, как я могу получить точную копию экземпляраjava.util.Random
?
ПРИМЕР
public class State
{
private final Random r;
private final long seed;
private Object currentOperand;
public State()
{
this(System.nanoTime(), null);
}
private State(long seed, Object currentOperand)
{
this.seed = seed;
this.r = new Random(seed);
this.currentOperand = currentOperand;
}
public State copy()
{
return new State(seed, currentOperand);
}
public void doSth()
{
/* operation with random operand */
currentOperand = r.nextInt(100);
}
public void redo()
{
// redo then set to null
currentOperand = null;
}
/* for completeness' sake... since it's simulated annealing */
public int computeEnergy() { return 0; }
}