Каково качество случайности алгоритмов шума Перлина / симплекса?
Каково качество случайности алгоритма шума Перлина и алгоритма Симплексного шума?
Какой из двух алгоритмов обладает лучшей случайностью?
По сравнению со стандартными псевдослучайными генераторами имеет ли смысл использовать Perlin / Simplex в качестве генератора случайных чисел?
Обновление: Я знаю, для чего используется шум Перлина/симплекса. Меня интересуют только свойства случайности.
3 ответа:
Как сказано в" статистике случайных чисел", AI Game Wisdom 2, вопрос, который производит "лучшую" случайность, зависит от того, для чего вы ее используете. Как правило, качество PRNGs сравнивается с помощью тестовых батарей. Во время печати автор указывает, что наиболее известными и наиболее широко используемыми тестовыми батареями для проверки случайности PRNGs являются ENT & несгибаемый . Кроме того, смотрите связанные вопросы Как проверить случайные числа и почему статистические тесты на случайность кажутся нерегулярными .
Помимо стандартных вопросов тестирования типичных PRNGs, тестирование шума Перлина или Симплексного шума как PRNGs является более сложным, потому что:
- оба внутренне требуют PRNG, таким образом, случайность их выхода зависит от лежащего в основе PRNG.
- большинство Прнг не имеют настраиваемых параметров. В отличие от этого, шум Перлина-это суммирование одной или нескольких когерентных шумовых функций (октав) с постоянно увеличивающимися частотами и постоянно уменьшающимися амплитуды. Поскольку конечное изображение зависит от количества и природы используемых октав, качество случайности будет меняться соответственно. libnoise: Изменение параметров модуля шума
- аргумент, подобный #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)]; ...
Я думаю, ты запутался.
Перлин и симплекс берут случайные числа из какого-то другого источника и делают ихменее случайными, чтобы они больше походили на природные ландшафты (только случайные числа не похожи на природные ландшафты).
Таким образом, они не являются источником случайных чисел - это способ обработки случайных чисел откуда-то еще. И даже если бы они были источником, они не были бы хорошим источником (числа сильно коррелированы).