Параметрическая случайная функция для генерации 2D-шума

#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 Просто в сторону, чтобы избежать некоторой путаницы, я думаю, что повторение могло быть частично (но не полностью) связано с неисправной функцией поиска по словарю, которую я написал. Однако это объясняет только некоторую симметрию, а не повторение.