Początkowo stwierdziłem, że Minecraft używa domyślnej klasy Java Random
do generowania liczb pseudolosowych. Random
używa 48-bitowych nasion.
Jednak oznaczałoby to, że nasiona 1 i 2 48 +1 wynik w tym samym świecie, który inni wskazywali, nie jest prawdą. Więc poszedłem trochę dalej.
Wydaje się, że Minecraft używa Random
wszędzie oprócz kodu generującego biom. Tam używa własnego, samodziałowego generatora losowego. Z GenLayer.java:
protected int nextInt (int upperBound) {int randVal = (int) ((this.chunkSeed >> 24)% (long) upperBound); if (randVal < 0) {randVal + = upperBound; } this.chunkSeed * = this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed + = this.worldGenSeed; return randVal;}
To jest generator kongruencji liniowej z wartościami a = 6364136223846793005
i m = 1442695040888963407
. To rzeczywiście da 2 64 odrębne strumienie wyjściowe, a zatem istnieją 2 64 odrębne światy.
Oświadczenie dotyczące wiki Minecrafta, które „nasiona trybu wieloosobowego mogą mieć tylko 2 48 możliwych wartości [..] z powodu użycia Random.nextLong ()
” jest niepoprawne . Generatory świata dla jednego gracza i dla wielu graczy nie różnią się od siebie.
Użycie Random
wszędzie indziej oznacza , że niektóre rzeczy będą to samo między nasionami mniejszymi o 2 48 , na przykład nasiona 1 i 2 48 +1. Na przykład lokalizacja rud powinna być prawie taka sama między nimi (z wyjątkiem rud usuwanych przez systemy jaskiniowe) .
Ponadto użycie nasion na kawałek ma kilka interesujących konsekwencji. Na przykład, biorąc pod uwagę małą liczbę biomów i dużą liczbę fragmentów, w każdym danym świecie istnieje bardzo duże prawdopodobieństwo, że są dwa takie same fragmenty. Jednak znalezienie tych kawałków wymaga matematyki, która jest poza mną. Jeśli ktoś chciałby się tego dowiedzieć, kod inicjujący chunkSeed
to
public void initChunkSeed (long chunkX, long chunkY) {this.chunkSeed = this. worldGenSeed; for (int i = 0; i < 2; i ++) {this.chunkSeed * = this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed + = chunkX; this.chunkSeed * = this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed + = chunkY; }}