Быстрый доступ к произвольным случайным числам
От: jamesq Россия  
Дата: 04.06.22 16:08
Оценка:
Навеяно той самой игрой Minecraft. Я в неё играл, и меня всё один вопрос занимает.
Как они сделали, что можно телепортироваться в любую точку огромнейшего мира.
И там сравнительно быстро сгенерируется то, что в окрестности этой точки должно быть?
Т.е. ландшафт, биомы, деревни, и прочая.

При этом, хоть ты генерируешь лишь участок мира в окрестности точки. Хоть генерируешь весь мир целиком — без разницы. Та окрестность в обоих случаях будет идентична.

Судя по всему, чтобы так быстро генерировать, они не рассчитывают хоть какую-то информацию о всём мире. Они сразу знают, что должно быть в той точке.

Вот смотрите, как я представляю, простой генератор мира работает.
Делим весь мир на клетки. Есть некая центральная клетка, от которой пляшем.
Нумеруем все клетки мира "улиткой", начиная с центральной клетки. Т.е. берётся всё более и более крупный виток этой улитки. И рано или поздно, любая клетка мира войдёт в какой-то виток, а значит получит номер.
Т.е. все клетки мира можно сопоставить некой натуральной последовательности.
Ну и сгенерировать псевдослучайную последовательность, которая задаст некоторое псевдослучайное число каждой клетке мира.

В итоге, когда мы переместимся в любую клетку, мы можем вычислить нужное число псевдослучайной последовательности для этой клетки. Ну и затем, от него плясать, генерируя мир в окрестностях точки, которая попала в текущую клетку.

Понятно тогда, что мир будет генерироваться всегда один и тот же.

Проблема в том, что расчёт всей этой псевдослучайной последовательности может занять кучу времени. Особенно, для удалённых клеток от центральной клетки.

А вот как сопоставить случайные числа произвольным клеткам без необходимости вычислять псевдослучайную последовательность? Т.е. обеспечить быструю реакцию при телепортации по карте?

В принципе, у меня есть мысли. Но это не то.
Можно например рассматривать блоки клеток разного порядка.
Блок 0-го порядка это, скажем, квадрат из 5 на 5 клеток.
Блок 1-го порядка, это скажем, квадрат из 5 на 5 блоков 0-го порядка
Блок 2-го порядка — квадрат 5 на 5 блоков 1-го порядка.
Ну и разбить весь мир на блоки. Центральная клетка лежит в центре блока 0-го порядка.
Дальше, блок 1-го порядка держит в себе в центре — центральный блок 0-го порядка.
Блок 2-го порядка держит в себе в центре — центральный блок 1-го порядка.

Ну и улиткой сначала нумеровать клетки в блоке 0-го порядка. Потом, нумеровать уже сразу блоки 1-го порядка (а не клетки внутри), а потом блоки 2-го порядка...

В общем, чем дальше уходит последовательность, тем более крупные участки мира нумеруются.
Ну а дальше, можно взять случайное число, ассоциированное с блоком в качестве исходного элемента вторичной псевдослучайной последовательности. Которой пронумеровать все клетки внутри блока.

Примерно представляете, о чём речь? Но это довольно всё левый, неудачный метод.
Боюсь, качество получаемых случайных чисел будет не очень.

Как ещё можно поступить?
Как они вообще там сделали?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.