Jag uppgav ursprungligen att Minecraft använder Java: s standardklass Random
för pseudoslumpgenerering. Slumpmässigt
använder 48-bitarsfrön.
Det skulle dock innebära att frön 1 och 2 48 +1 resultat i samma värld, som andra har påpekat, är inte sant. Så jag grävde mer.
Minecraft verkar använda Slumpmässig överallt utom för biogenereringskoden. Där använder den sin egen slumpgenerator från hemspunnen. Från GenLayer.java:
skyddad 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; returnera randVal;}
Detta är en linjär kongruentialgenerator med värden a = 6364136223846793005
och m = 1442695040888963407
. Detta kommer verkligen att producera 2 64 distinkta utflöden, och därmed det finns 2 64 distinkta världar.
Påståendet om Minecraft-wiki att "Multiplayerfrön får bara ha 2 48 möjliga värden [..] på grund av att Random.nextLong ()
" används är felaktig . Världsgeneratorerna för en spelare och multiplayer är inte olika.
Användningen av Slumpmässig överallt annars betyder betyder att vissa saker kommer att vara samma mellan frön som är avstängda med 2 48 , såsom frön 1 och 2 48 +1. Exempelvis bör malmens plats vara nästan densamma mellan de två (utom malmer som tas bort av grottsystem) .
Användningen av per-bit frön har också några intressanta konsekvenser. Till exempel, med tanke på det lilla antalet biomer och det stora antalet bitar, finns det i en viss värld mycket stor sannolikhet för att det finns två bitar som är exakt samma. Att hitta dessa bitar innebär emellertid matte som ligger utanför mig. Om någon är intresserad av att räkna ut det är koden för att initialisera chunkSeed
public void initChunkSeed (long chunkX, long chunkY) {this.chunkSeed = detta. 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; }}