Inizialmente ho affermato che Minecraft utilizza la classe Random
predefinita di Java per la generazione di numeri pseudo-casuali. Random
utilizza seed a 48 bit.
Tuttavia, ciò implicherebbe che i seed 1 e 2 48 +1 risultino nello stesso mondo, che altri hanno sottolineato non è vero. Così ho approfondito ancora.
Minecraft sembra utilizzare Random
ovunque tranne per il codice di generazione del bioma. Lì, utilizza il proprio generatore casuale fatto in casa. Da 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;}
Questo è un generatore congruenziale lineare con valori a = 6364136223846793005
e m = 1442695040888963407
. Questo produrrà effettivamente 2 64 flussi di output distinti, e quindi ci sono 2 64 mondi distinti.
L'affermazione su il wiki di Minecraft secondo cui "I semi multiplayer possono avere solo 2 48 valori possibili [..] a causa dell'utilizzo di Random.nextLong ()
" non è corretto . I generatori di mondi per giocatore singolo e multiplayer non sono diversi.
L'uso di Random
ovunque significa che alcune cose saranno lo stesso tra i semi che sono spenti di 2 48 , come i semi 1 e 2 48 +1. Ad esempio, la posizione dei minerali dovrebbe essere quasi la stessa tra i due (ad eccezione dei minerali rimossi dai sistemi di caverne) .
Inoltre, l'uso di semi per pezzo ha alcune conseguenze interessanti. Ad esempio, dato il piccolo numero di biomi e il gran numero di blocchi, in un dato mondo c'è un'altissima probabilità che ci siano due blocchi esattamente uguali. Trovare quei pezzi, tuttavia, implica la matematica che è al di là di me. Se qualcuno è interessato a capirlo, il codice per inizializzare il chunkSeed
è
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; }}