#java #function #random #2d #procedural
#java #Функция #Случайный #2d #Процедурная
Вопрос:
Я пытаюсь сгенерировать бесконечную случайную местность. Местность должна генерироваться одинаково каждый раз, когда задается одно и то же начальное значение.
Я пытался использовать случайную функцию Java, создавая начальное значение, используя различные функции координат x и y данного узла в сетке местности. Например, x * y x y seed, 20 * x 30 * y и т.д.
Проблема с этим подходом заключается в том, что я всегда вижу четкие закономерности в генерируемых числах.
Итак, в основном я хочу: f (x, y) = случайное число
Было бы полезно, если бы вышеупомянутая функция могла включать в себя какое-либо начальное значение, делая его: f(x, y, начальное значение) = случайное число
Мне нужно будет сгенерировать несколько чисел для каждой комбинации x, y, но должно быть достаточно легко получить дополнительные числа, как только у меня появится вышеуказанная функция. Они будут служить для определения высоты местности и того, какие объекты (здания, деревья) будут присутствовать.
Пожалуйста, не упоминайте о шуме Перлина или других подобных методах. Моя проблема не в том, чтобы шум выглядел хорошо, он получает надежный «случайный» шум.
Спасибо, Джейми.
Комментарии:
1. Вы видите четкие закономерности в числах, сгенерированных java.util. Случайно? Хотите подробнее рассказать о том, что это за шаблоны?
2. На местности есть шаблоны, повторяющиеся как по горизонтали, так и по вертикали.
3. Можете ли вы загрузить пример этих шаблонов и код, который их сгенерировал? Я довольно заинтересован в этом; это тоже одно из моих увлечений. (Раньше это было то, что я делал в исследовательской фирме, в которой я тоже работал.)
Ответ №1:
Вы ищете функцию хеширования. Попробуйте один из них:
http://www.concentric.net /~ttwang/tech/inthash.htm
Вот пример использования:
int hash32shift(int key)
{
key = ~key (key << 15); // key = (key << 15) - key - 1;
key = key ^ (key >>> 12);
key = key (key << 2);
key = key ^ (key >>> 4);
key = key * 2057; // key = (key (key << 3)) (key << 11);
key = key ^ (key >>> 16);
return key;
}
int noise(int x, int y, int seed)
{
return hash32shift(seed hash32shift(x hash32shift(y)));
}
И это выглядит так:
Комментарии:
1. Я попробую это, как только вернусь домой, большое спасибо. Прежде чем я просто вставлю это, мне нужно будет исследовать операторы Java, существование «>>>» поразило меня, лол.
2. Я использовал это в сочетании с функцией Random, так что теперь каждый узел имеет в своем распоряжении ряд случайных чисел. : D Просто в сторону, чтобы избежать некоторой путаницы, я думаю, что повторение могло быть частично (но не полностью) связано с неисправной функцией поиска по словарю, которую я написал. Однако это объясняет только некоторую симметрию, а не повторение.