Ich habe ursprünglich angegeben, dass Minecraft Javas Standardklasse Random
für die Erzeugung von Pseudozufallszahlen verwendet. Random
verwendet 48-Bit-Seeds.
Dies würde jedoch bedeuten, dass die Seeds 1 und 2 48 sup> +1 resultieren in der gleichen Welt, auf die andere hingewiesen haben, ist nicht wahr. Also habe ich noch ein bisschen gegraben.
Minecraft scheint überall Random
zu verwenden, außer für den Code zur Biomgenerierung. Dort verwendet es einen eigenen hausgemachten Zufallsgenerator. From 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;}
Dies ist ein linearer Kongruenzgenerator mit den Werten a = 6364136223846793005
und m = 1442695040888963407
. Dies wird in der Tat 2 sup> 64 sup> unterschiedliche Ausgabestreams erzeugen, und somit gibt es 2 64 sup> unterschiedliche Welten.
Der Anspruch auf Das Minecraft-Wiki, dass "Multiplayer-Seeds möglicherweise nur 2 48 sup> mögliche Werte [..] haben, weil Random.nextLong ()
" verwendet wird, ist falsch . Die Einzelspieler- und Mehrspieler-Weltgeneratoren unterscheiden sich nicht.
Die Verwendung von Random
überall sonst bedeutet, dass einige Dinge die sein werden Gleiches gilt für Samen, die um 2 sup> 48 sup> versetzt sind, wie z. B. Samen 1 und 2 48 sup> +1. Zum Beispiel sollte die Position der Erze zwischen den beiden fast identisch sein (mit Ausnahme der Erze, die durch Höhlensysteme entfernt wurden) .
Auch die Verwendung von Samen pro Stück hat einige interessante Konsequenzen. Zum Beispiel besteht angesichts der geringen Anzahl von Biomen und der großen Anzahl von Brocken in jeder gegebenen Welt eine sehr hohe Wahrscheinlichkeit, dass es zwei Brocken gibt, die genau gleich sind. Das Finden dieser Brocken erfordert jedoch Mathematik, die mir ein Rätsel ist. Wenn jemand daran interessiert ist, es herauszufinden, lautet der Code zum Initialisieren des chunkSeed
public void initChunkSeed (long chunkX, long chunkY) {this.chunkSeed = this. worldGenSeed; für (int i = 0; i < 2; i ++) {this.chunkSeed * = this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed + = chunkX; this.chunkSeed * = this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed + = chunkY; }}