Я написал небольшое симулятор хищника-жертвы на Java. Даже если правила довольно сложны и заканчиваются хаотичной системой, используемые методы просты:
- арифметика и решения по основным типам данных
- нет внешних библиотек
- внешние системы не включены
- no concurrency происходит
- отсутствие текущего времени или даты
Поэтому я думал, что при инициализации системы с одинаковыми параметрами он должен выводить одинаковые результаты, но это не так, и мне интересно, почему.
Некоторые мысли по этому поводу:
Мое приложение использует Random
s, но для этого теста я инициализирую их все с заданным значением, поэтому, в моем понимании, они должны создавать для каждого запуска те же самые выходы в том же порядке.
Я повторяю через Set
s, и я знаю, что порядок a Set
итерирован, не определен. Но я не вижу причин, почему Set
, который заполняется в том же порядке с одинаковыми значениями, должен вести себя по-разному в нескольких прогонах. Это?
Я использую много float
s. Типы данных, где 1 + 1 = 1.9999999999725, всегда подозревают меня, но я даже если их поведение странно для меня, оно должно быть всегда одинаковым. Не правда ли?
Сбор мусора не детерминирован, но пока я не полагаюсь на деструкторов, я должен быть в безопасности.
Как указано выше, в зависимости от фактического времени использования нет concurrency и нет типов данных.
Я не могу воспроизвести это поведение в простом примере. Но, проходя мой код, я не вижу ничего, что могло бы быть непредсказуемым. Так не ошибаются ли какие-либо из моих предположений? Любые идеи, что я мог бы потерять?
Здесь проверите мои предположения:
public static void main(String[] args) {
Random r = new Random(1);
Set<Float> s = new HashSet<Float>();
for (int i = 0; i < 1000000; i++) {
s.add(r.nextFloat());
}
float ret = 1;
int cnt = 0;
for (Float f : s) {
float multiply = 0.3f;
if (cnt++ % 2 == 0) {
multiply = 0.7f;
}
float f2 = (f * multiply);
ret += f2;
}
System.out.println(ret);
}
Это всегда для меня 242455.25.