Каково качество случайности алгоритмов Perlin / Simplex Noise?

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

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

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

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


person Zhen    schedule 18.09.2012    source источник


Ответы (4)


Как указано в «Статистике случайных чисел», AI Game Wisdom 2, спрашивая, что дает ' Лучшая случайность зависит от того, для чего вы ее используете. Как правило, качество ГПСЧ сравнивается с помощью тестовых батарей. На момент публикации автор указывает, что самыми известными и наиболее широко используемыми тестовыми батареями для проверки случайности ГПСЧ являются ЛОР и Дихард. Также см. Связанные вопросы как проверять случайные числа и почему тесты статистической случайности кажутся специальными.

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

  1. Оба внутренне требуют ГПСЧ, поэтому на случайность их вывода влияет нижележащий ГПСЧ.
  2. Большинство PRNG не имеют настраиваемых параметров. Напротив, шум Перлина - это сумма одной или нескольких функций когерентного шума (октав) с постоянно увеличивающимися частотами и постоянно уменьшающимися амплитудами. Поскольку окончательное изображение зависит от количества и характера используемых октав, качество случайности будет соответственно меняться. libnoise: изменение параметров модуля шума
  3. Аргумент, аналогичный пункту 2, справедлив для изменения количества измерений, используемых в симплексном шуме, поскольку «трехмерная часть четырехмерного симплексного шума отличается от трехмерного симплексного шума». Демистификация симплексного шума Стефана Густавсона.
person Pikalek    schedule 03.12.2012

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

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

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

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

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

Следовательно, результаты алгоритма на самом деле не являются «случайными»; как видите, существует множество легко различимых закономерностей.

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

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

Обновление:

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

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

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

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)];

...

Затем несколько случайный шум сглаживается и фактически смешивается с соседними пикселями, создавая узоры.

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

person Realz Slaw    schedule 19.09.2012

я думаю вы запутались.

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

поэтому они не являются источником случайных чисел - они являются способом обработки случайных чисел откуда-то еще.

и даже если бы они были источником, они не были бы хорошим источником (числа сильно коррелированы).

person andrew cooke    schedule 19.09.2012

НЕ используйте перлин или симплекс для случайности. они не предназначены для этого. они / приложение / случайности.

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

perlin / simplex с smoothstep идеально гладкие. независимо от того, насколько сильно вы увеличиваете масштаб, они всегда будут градиентом, а не вершиной или ребром.

диапазон вывода составляет (+/- 1/2 x #dimensions), поэтому вам необходимо компенсировать это, чтобы получить диапазон от 0 до 1 или от -1 до 1, если необходимо. это стандартное исправление. добавление октав увеличит этот диапазон на коэффициент масштабирования октавы (обычно это половина большей октавы, конечно).

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

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

Результаты Perlin имеют тенденцию быть круглыми с восьмиугольным смещением, в то время как симплексные результаты имеют тенденцию генерировать овалы с шестиугольным смещением.

срез симплекса более высокой размерности не похож на симплекс более низкой размерности. но 2d-фрагмент 3d-перлина выглядит почти так же, как 2d-перлин.

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

Я считаю, что после «октавирования» они оба имеют одинаковое треугольное распределение вывода при наложении (похоже на бросание двух кубиков) (люблю, если бы кто-то мог дважды проверить это для меня.), и поэтому оба выигрывают от плавного шага. это стандарт. (возможно смещение результатов для равного вывода, но при этом все равно будут иметь место смещения размеров, которые не пройдут тесты качества prng из-за высокой пространственной корреляции, которая является / функцией /, а не ошибкой.)

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

симплекс быстрее во всех случаях - / особенно / в более высоких измерениях.

so simplex решает проблемы Perlin как с производительностью, так и с визуализацией, но вносит свои собственные проблемы.

person Bad Radish    schedule 24.05.2019