Процедурная генерация по сиду выдаёт разные карты на разных машинах
Рейтинг: 73.8% · 74 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- valera_vector
- Сообщения: 32
- Зарегистрирован: Пн май 11, 2026 8:23 am
✔ Лучший ответ сформирован автоматически — ivan_neon11
Вторая причина — порядок итерации по Dictionary или HashSet. В .NET это не гарантировано, и если генератор итерирует по словарю при построении карты, порядок будет разным между запусками и платформами. Замени на SortedDictionary или List с явной сортировкой там где нужен детерминизм. Третье: float-арифметика может давать разные результаты на x86 и ARM (у тестера M1/M2 Mac или мобильный девайс?). …
- anton_loop
- Сообщения: 2
- Зарегистрирован: Вс май 24, 2026 3:19 pm
Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах
Классика. Где-то используешь System.Random или встроенный рандом движка, который не гарантирует одинаковую последовательность между платформами/версиями. Заведи свой детерминированный PRNG, например xorshift, и сей только его.
- yaroslav_hex13
- Сообщения: 20
- Зарегистрирован: Пн май 11, 2026 8:32 am
- semyon7320
- Сообщения: 14
- Зарегистрирован: Сб май 16, 2026 3:00 am
Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах
@perf_freak о, про обход словаря в точку — у меня биомы расставляются итерацией по Dictionary. Порядок реально не гарантирован. Это могло давать расхождение даже при одинаковом рандоме?
Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах
@gopher_max именно. Если ты вызываешь rng в порядке итерации словаря, а порядок недетерминирован — последовательность вызовов плывёт, и карта вместе с ней. Замени на List с явной сортировкой по ключу.
- griddocker4829
- Сообщения: 1
- Зарегистрирован: Ср май 13, 2026 8:56 pm
- anton_py83
- Сообщения: 5
- Зарегистрирован: Пн май 11, 2026 10:49 pm
Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах
Первое что нужно проверить — какой генератор случайных чисел используешь. Стандартный System.Random в Unity (и C# в целом) до .NET 6 давал разные последовательности в зависимости от реализации runtime. Если используешь UnityEngine.Random — он детерминирован в пределах одного запуска, но InitState должен вызываться явно до любых других вызовов. Проверь нет ли где-то вызова Random.Range до SetInitState(seed).
- ivan_neon11
- Сообщения: 7
- Зарегистрирован: Пт май 15, 2026 11:09 pm
Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах
✔ Лучший ответ — сформирован автоматически
Вторая причина — порядок итерации по Dictionary или HashSet. В .NET это не гарантировано, и если генератор итерирует по словарю при построении карты, порядок будет разным между запусками и платформами. Замени на SortedDictionary или List с явной сортировкой там где нужен детерминизм. Третье: float-арифметика может давать разные результаты на x86 и ARM (у тестера M1/M2 Mac или мобильный девайс?). Если сид-генерация проходит через float — переходи на int-математику с фиксированной точкой.
- kira_app10
- Сообщения: 23
- Зарегистрирован: Вт май 12, 2026 2:35 am
Re: Процедурная генерация по сиду выдаёт разные карты на разных машинах
Для отладки удобно добавить хеш от финального состояния карты и логировать его вместе с сидом. Тогда сразу видно на каком шаге расходятся результаты. В Unity есть ещё нюанс с Physics-симуляцией если она задействована в генерации — физдвижок не детерминирован между платформами по определению, только в пределах одной сессии.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость