Каково качество случайности алгоритмов шума Перлина / симплекса?


Каково качество случайности алгоритма шума Перлина и алгоритма Симплексного шума?

Какой из двух алгоритмов обладает лучшей случайностью?

По сравнению со стандартными псевдослучайными генераторами имеет ли смысл использовать Perlin / Simplex в качестве генератора случайных чисел?

Обновление: Я знаю, для чего используется шум Перлина/симплекса. Меня интересуют только свойства случайности.

3 6

3 ответа:

Как сказано в" статистике случайных чисел", AI Game Wisdom 2, вопрос, который производит "лучшую" случайность, зависит от того, для чего вы ее используете. Как правило, качество PRNGs сравнивается с помощью тестовых батарей. Во время печати автор указывает, что наиболее известными и наиболее широко используемыми тестовыми батареями для проверки случайности PRNGs являются ENT & несгибаемый . Кроме того, смотрите связанные вопросы Как проверить случайные числа и почему статистические тесты на случайность кажутся нерегулярными .

Помимо стандартных вопросов тестирования типичных PRNGs, тестирование шума Перлина или Симплексного шума как PRNGs является более сложным, потому что:

  1. оба внутренне требуют PRNG, таким образом, случайность их выхода зависит от лежащего в основе PRNG.
  2. большинство Прнг не имеют настраиваемых параметров. В отличие от этого, шум Перлина-это суммирование одной или нескольких когерентных шумовых функций (октав) с постоянно увеличивающимися частотами и постоянно уменьшающимися амплитуды. Поскольку конечное изображение зависит от количества и природы используемых октав, качество случайности будет меняться соответственно. libnoise: Изменение параметров модуля шума
  3. аргумент, подобный #2, справедлив для изменения числа измерений, используемых в симплексном шуме, поскольку " 3D-секция 4D симплексного шума отличается от 3D симплексного шума."Симплексный шум Стефана Густавсона демистифицирован.

Перлиновый шум и симплексный шум предназначены для создания полезного шума, а не для того, чтобы быть полностью случайными. Эти алгоритмы обычно используются для создания процедурно генерируемых ландшафтов и тому подобного. Например, он может генерировать рельеф, такой как этот (изображение из здесь):

Ландшафт, созданный из шума Перлина

На этом изображении шум генерирует 2D-карту высоты, такую как эта (изображение из здесь):

Карта высоты, генерируемая шумом Перлина

Цвет каждого пикселя представляет собой высоту. После получения высот, а рендерер используется для создания рельефа, соответствующего "высотам" (цветам) изображения.

Таким образом, результаты алгоритма на самом деле не являются "случайными"; существует множество легко различимых паттернов, как вы можете видеть. Симплекс предположительно выглядит немного "приятнее", что подразумевает меньшую случайность, но его основное назначение состоит в том, что он производит аналогичный шум, но лучше масштабируется в более высоких измерениях. То есть, если бы кто-то производил шум 3D,4D,5D, симплексный шум превзошел бы шум Перлина, и произведите аналогичные результаты.

Если вам нужен общий генератор psuedo-случайных чисел, посмотрите на твистер Мерсенна или другие prngs. Имейте в виду, wrt для криптографии, prngs может быть полна предостережений.

Обновление:

(ответ на обновленный вопрос OPs)

Что касается случайных свойств этих шумовых функций, я знаю, что perlin noise использует prng (очень) бедного человека в качестве входного сигнала и выполняет некоторое сглаживание/интерполяцию между соседними "случайными" пикселями. Входная случайность на самом деле является просто псевдослучайным индексированием в предварительно вычисленный случайный вектор.

Индекс вычисляется с помощью простых целочисленных операций, ничего особенного. Например, проект noise++ использует предварительно вычисленные "случайные векторы" (см. здесь) для получения своего исходного шума и интерполирует между различными значениями из этого вектора. Он генерирует" случайный " индекс в этот вектор с помощью некоторых простых целочисленных операций, добавляя небольшое количество псевдослучайности. Вот такой фрагмент:

int vIndex = (NOISE_X_FACTOR * ix + NOISE_Y_FACTOR * iy + NOISE_Z_FACTOR * iz + NOISE_SEED_FACTOR * seed) & 0xffffffff;
vIndex ^= (vIndex >> NOISE_SHIFT);
vIndex &= 0xff;

const Real xGradient = randomVectors3D[(vIndex<<2)];

...
Затем несколько случайный шум сглаживается и фактически смешивается с соседними пикселями, создавая паттерны. После создания начального шума Перлин / симплексный шум имеет понятие октав шума; то есть, повторное слияние шума в себя в разных масштабах. Это производит еще больше скороговорки. Таким образом, начальное качество шума, вероятно, так же хорошо, как и предварительно вычисленные случайные массивы, плюс эффект псевдослучайной индексации. Но после все, что делает с ним шум Перлина, видимая случайность значительно уменьшается (на самом деле она распространяется на более широкую область, я думаю).

Я думаю, ты запутался.

Перлин и симплекс берут случайные числа из какого-то другого источника и делают ихменее случайными, чтобы они больше походили на природные ландшафты (только случайные числа не похожи на природные ландшафты).

Таким образом, они не являются источником случайных чисел - это способ обработки случайных чисел откуда-то еще. И даже если бы они были источником, они не были бы хорошим источником (числа сильно коррелированы).