Napisałem małą symulację drapieżników-zdobycz w Javie. Nawet jeśli przepisy są dość skomplikowane i kończy się w układzie chaotycznym techniki wykorzystywane są proste:Java nie deterministyczny?
- arytmetyki i decyzje dotyczące podstawowych typów danych
- żadnych zewnętrznych bibliotek
- żadne systemy zewnętrzne są ujęte
- brak współbieżności występuje
- bez użycia aktualnego czasu i daty
pomyślałem więc przy inicjalizacji systemu z identyczne parametry powinno dać identyczne wyniki, ale nie ma i zastanawiam się, dlaczego.
Kilka zdań na ten temat: Moja aplikacja używa Random
s, ale dla tego testu inicjalizuję je wszystkie z podaną wartością, więc w moim rozumieniu powinny one dla każdego uruchomienia tworzyć te same wyjścia w tej samej kolejności.
Jestem Iterowanie poprzez Set
s, i wiem, że kolejność iteracji Set
nie jest zdefiniowany. Ale nie widzę żadnego powodu, dla którego Set
, który jest wypełniony w tej samej kolejności tymi samymi wartościami, powinien zachowywać się inaczej w kilku seriach. Czy to?
Używam dużo float
s. Typy danych, w których 1 + 1 = 1.9999999999725 są zawsze podejrzane, ale nawet jeśli ich zachowanie jest dla mnie dziwne, zawsze powinno być tak samo dziwne. Czyż nie?
Zbiór śmieci nie jest deterministyczny, ale dopóki nie polegam na destruktorach, powinienem być bezpieczny.
Jak wspomniano powyżej, nie ma współbieżności i nie ma typów danych w zależności od rzeczywistego czasu użytkowania.
Nie mogę odtworzyć tego zachowania w prostym przykładzie. Przechodząc przez mój kod, nie widzę niczego, co mogłoby być nieprzewidywalne. Czy którekolwiek z powyższych założeń jest błędne? Jakieś pomysły, których mógłbym przegapić?
Oto test, aby zweryfikować swoje założenia:
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);
}
Wynika to zawsze w 242455.25 dla mnie.
Funkcja czasu? – Mysticial
Kiedy mówisz, że zainicjujesz losowe dane, masz na myśli wykorzystanie nasion? – tjameson
To brzmi interesująco. Czy możemy rzucić okiem na twój kod? – kol