Minecraft. Ты вводишь число при создании мира и получаешь конкретный ландшафт.
Через год вводишь то же число — тот же ландшафт. Это seed.
Seed — это просто начальное значение для PRNG. Пока генератор тот же,
последовательность всегда идентична.
Практический паттерн: отдельный генератор для каждой системы
public class SeededRandom
{
private System.Random rng;
public int Seed { get; private set; }
public SeededRandom(int seed)
{
Seed = seed;
rng = new System.Random(seed);
}
public int Next(int min, int max) => rng.Next(min, max);
public float NextFloat() => (float)rng.NextDouble();
}
// Каждый регион карты — свой генератор:
var dungeonRng = new SeededRandom(worldSeed ^ 0xDEAD);
var lootRng = new SeededRandom(worldSeed ^ 0xBEEF);
var enemyRng = new SeededRandom(worldSeed ^ 0xCAFE);
XOR с разными константами гарантирует, что генераторы идут по разным дорожкам,
но оба воспроизводимы при известном worldSeed.
Три применения:
→ Процедурные карты — один seed = один мир
→ Реплеи — записываешь только ввод игрока + seed, а не весь стейт
→ Отладка — нашёл баг? Скажи seed разработчику, он воспроизведёт
#мат_геймдев #МатРазбор #рандом