Originalmente dije que Minecraft usa la clase Random
predeterminada de Java para la generación de números pseudoaleatorios. Random
usa semillas de 48 bits.
Sin embargo, eso implicaría que las semillas 1 y 2 48 +1 dan como resultado en el mismo mundo, lo que otros han señalado no es cierto. Así que investigué un poco más.
Minecraft parece usar Random
en todas partes excepto para el código de generación de bioma. Allí, utiliza su propio generador aleatorio casero. De GenLayer.java:
protected int nextInt (int upperBound) {int randVal = (int) ((this.chunkSeed >> 24)% (long) upperBound); si (randVal < 0) {randVal + = upperBound; } this.chunkSeed * = this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed + = this.worldGenSeed; return randVal;}
Este es un generador congruencial lineal con valores a = 6364136223846793005
y m = 1442695040888963407
. De hecho, esto producirá 2 64 flujos de salida distintos y, por lo tanto, hay 2 64 mundos distintos.
La afirmación sobre la wiki de Minecraft que "Las semillas multijugador solo pueden tener 2 48 valores posibles [..] debido al uso de Random.nextLong ()
" es incorrecta . Los generadores de mundos para un jugador y multijugador no son diferentes.
El uso de Random
en cualquier otro lugar significa que algunas cosas serán las lo mismo entre las semillas que tienen una diferencia de 2 48 , como las semillas 1 y 2 48 +1. Por ejemplo, la ubicación de los minerales debería ser casi la misma entre los dos (excepto los minerales extraídos por sistemas de cuevas) .
Además, el uso de semillas por trozo tiene algunas consecuencias interesantes. Por ejemplo, dada la pequeña cantidad de biomas y la gran cantidad de fragmentos, en cualquier mundo dado existe una probabilidad muy alta de que haya dos fragmentos que sean exactamente iguales. Sin embargo, encontrar esos trozos implica matemáticas que me superan. Si alguien está interesado en averiguarlo, el código para inicializar chunkSeed
es
public void initChunkSeed (long chunkX, long chunkY) {this.chunkSeed = this. worldGenSeed; para (int i = 0; i < 2; i ++) {this.chunkSeed * = this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed + = chunkX; this.chunkSeed * = this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed + = chunkY; }}