How Minecraft structure placement works
Almost every structure in Minecraft is placed by the same algorithm. Understanding it explains why seed maps work, and why a marker is not always a guarantee.
The region grid
For each structure type, Minecraft divides the world into square regions measured in chunks. The size of that square is the structure spacing: 34 chunks for villages, 32 for desert pyramids, 80 for woodland mansions. Each region gets at most one candidate position.
Choosing the position
The candidate is chosen by a random number generator seeded from three things: the region coordinates, the world seed, and a constant salt unique to the structure type. Because the salt differs per structure, villages and pyramids sharing the same region land in different places.
The offset inside the region is drawn from a range of spacing minus separation. Separation is what keeps two structures in neighbouring regions from generating right next to each other across the border. Some structures use a triangular distribution instead of a uniform one, which biases them towards the middle of their region — woodland mansions and ancient cities behave this way.
The second check
Having a position is not enough. Minecraft then asks whether the biome at that position is in the structure list, and for some structures whether the terrain is suitable — deep enough ocean for a monument, solid ground for an end city. Only then does the structure generate.
Structures that work differently
- Strongholds use eight concentric rings around the world origin, then snap to the nearest valid biome.
- Buried treasure uses a one-chunk region with a one percent probability roll per chunk, and always sits nine blocks in from the chunk corner.
- Mineshafts are rolled per chunk rather than per region.
- Nether fortresses and bastion remnants share a single grid, so a region contains one or the other.
Why version matters
Spacing, separation and salt values are part of world generation data and have changed between releases. Village spacing moved from 32 to 34 chunks in 1.18, for example. Selecting the wrong version in a seed map shifts every marker.