Je me demandais combien de graines il y a dans Minecraft (1.8.7) et comment cela occupe si peu d'espace disque ? Je pense qu'il y a beaucoup de graines par type de monde, en calculant cela aussi pour TOUTES les combinaisons personnalisées. Je suis sûr qu'ils sont plus de zillions. Pouvez-vous me dire le nombre de graines ?
Réponses
Trop de publicités?Il y a 18.446.744.073.709.551.616 (2 64 ) des graines possibles. Toutes les graines sont des nombres, si des lettres sont saisies dans la case de la graine, Java's hashCode()
est utilisée pour le transformer en un nombre.
Les graines n'occupent pas beaucoup d'espace disque (elles sont stockées sous la forme d'un nombre entier long, soit seulement 8 octets par monde), car seule la graine qui a été choisie pour un monde est stockée, et non les 18 quintillions. Lorsqu'une graine est nécessaire pour la génération d'un monde, une graine aléatoire est générée à partir de l'horloge du système (ou entrée manuellement par l'utilisateur) et est ensuite stockée et utilisée pour générer le monde.
Combien de mondes possibles peuvent être générés, y compris les options de personnalisation ? Probablement plus que ce qu'un ordinateur peut calculer étant donné tous les curseurs de flottement disponibles dans un monde personnalisé.
Voici une image montrant une graine générée au hasard :
-3 010 441 696 458 036 422 est bien plus faible que -2 147 483 648 et -140 737 488 355 328. Cela signifie que les graines utilisent des plages d'entiers signés supérieures à 32 bits et 48 bits.
J'ai initialement déclaré que Minecraft utilise le défaut de Java Random
pour la génération de nombres pseudo-aléatoires. Random
utilise des graines de 48 bits .
Cependant, cela impliquerait que les graines 1 et 2 48 +1 résultat dans le même monde, ce qui, comme d'autres l'ont souligné, n'est pas vrai. J'ai donc creusé un peu plus.
Minecraft semble utiliser Random
partout sauf pour le code de biogénération. Là, il utilise son propre générateur aléatoire maison. De 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;
}
Il s'agit d'un générateur de congruence linéaire avec des valeurs a = 6364136223846793005
y m = 1442695040888963407
. Cela produira en effet 2 64 flux de sortie distincts, et donc il y a 2 64 des mondes distincts.
L'affirmation sur le wiki de Minecraft que "Les graines multijoueurs peuvent avoir seulement 2 48 valeurs possibles [ ] en raison de l'utilisation Random.nextLong()
" est incorrecte. Les générateurs de monde solo et multijoueur ne sont pas différents.
L'utilisation de Random
partout ailleurs fait signifie que certaines choses seront les mêmes entre des graines décalées de 2 %. 48 comme les graines 1 et 2 48 +1. Par exemple, l'emplacement des minerais devrait être presque le même entre les deux modèles. (sauf pour les minerais retirés par les systèmes de grottes) .
De plus, l'utilisation de graines par morceau a des conséquences intéressantes. Par exemple, étant donné le petit nombre de biomes et le grand nombre de morceaux, dans un monde donné, il y a une très forte probabilité que deux morceaux soient exactement les mêmes. Trouver ces morceaux, cependant, implique des mathématiques qui me dépassent. Si quelqu'un est intéressé à le découvrir, le code d'initialisation de la fonction chunkSeed
est
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;
}
}
La réponse se trouve donc ici : http://Minecraft.gamepedia.com/Seed_(niveau_génération)
Et même s'il y a déjà un lien sur cette page, personne ne semble l'avoir lu en entier.
Pour résumer :
Si vous utilisez un mot ou phrase puis String.hashCode()
est appelé et il limite le nombre maximum de graines à 2^32 à cause de son implémentation.
Si vous saisissez votre propre numéro o laisser le système déterminer la graine alors votre limite de graine est de 2^64 graines.
CEPENDANT :
Si c'est un monde multijoueur ils mettent en œuvre le nextLong()
La fonction java et les limites de celle-ci sont 2^48 options de semences possibles.
Les graines sont hachées en un nombre entier signé de 32 bits. Ce qui est un langage de programmeur pour un nombre qui peut être positif ou négatif, et qui a 32 valeurs en base 2.
Cela donne les nombres de -2 147 483 648 à 2 147 483 647.
En fonction de l'implémentation de Minecraft, certaines d'entre elles pourraient aboutir à un monde identique sous certains aspects, comme avoir 2 graines avec des biomes différents mais la même carte de hauteur.
Correction (partielle) : Si vous ne définissez pas une graine de texte, Minecraft prendra plutôt l'heure actuelle comme valeur, qui est un nombre de 64 bits donc il y a plus d'options.
Source : http://Minecraft.gamepedia.com/Seed_(niveau_génération)
Le nombre de graines n'est pas limité par l'application elle-même. Juste par la longueur de la valeur autorisée pour la graine elle-même.
Les graines ne seront pas stockées dans Minecraft. La graine elle-même sera juste une sorte de "valeur de départ" où la génération du monde commence son processus de génération. Il n'y a pas une graine pour chaque monde dans le jeu lui-même. Vous obtiendrez seulement le même monde que le processus de génération se déroulera et générera le même monde en raison des mêmes conditions de départ.
Vous pouvez le comparer en comptant les pas entre votre domicile et votre travail. Si la même condition s'applique tous les jours, le même chemin sera utilisé. S'il neige un jour ou si vous vous couchez un peu plus tard, les conditions de départ sont différentes et vous emprunterez un autre chemin ou un autre temps pour vous rendre à votre travail. Mais si la même condition différente s'applique un autre jour, elle se terminera de la même manière. C'est juste un exemple pour clarifier les choses pour les non-techniciens :-)
- Réponses précédentes
- Plus de réponses