Я написал небольшое симулятор хищника-жертвы на Java. Даже если правила достаточно сложны и в конечном итоге в хаотической системе методы, используемые просты:Java не детерминированный?
- арифметика и решения по основным типам данных
- без внешних библиотек
- не включены никакие внешние системы
- нет параллелизма не происходит
- без использования текущего времени или даты
Так я думал, что при инициализации системы с идентичные параметры, он должен выводить одинаковые результаты, но это не так, и мне интересно, почему.
Некоторые мысли по этому вопросу: Мое приложение использует Random
s, но для этого теста я инициализирую их все с заданным значением, поэтому, в моем понимании, они должны создавать для каждого запуска одни и те же выходы в одном порядке.
Я выполняю итерацию через Set
, и я знаю, что порядок а Set
итерирован не определен. Но я не вижу причин, почему Set
, который заполняется в том же порядке с одинаковыми значениями, должен вести себя по-разному в нескольких прогонах. Имеет ли это?
Я использую много float
s. Типы данных, где 1 + 1 = 1.9999999999725, всегда подозревают меня, но я даже если их поведение странно для меня, оно должно быть всегда одинаковым. Не так ли?
Сбор мусора не является детерминированным, но до тех пор, пока я не полагаюсь на деструкторов, я должен быть в безопасности.
Как было сказано выше, в зависимости от фактического времени использования нет параллелизма и нет типов данных.
Я не могу воспроизвести это поведение в простом примере. Но, проходя мой код, я не вижу ничего, что могло бы быть непредсказуемым. Так не ошибаются ли какие-либо из моих предположений? Любые идеи, что я мог бы потерять?
Вот тест, чтобы проверить свои предположения:
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 для меня.
Функция времени? – Mysticial
Когда вы говорите, что вы инициализируете свои случайные данные, вы имеете в виду, что используете семя? – tjameson
Это звучит интересно. Можем ли мы взглянуть на ваш код? – kol