Я ищу генератор псевдослучайных чисел, который был бы специализирован для быстрой работы, когда ему давали семя перед генерированием каждого номера. Большинство генераторов, которые я видел до сих пор, предполагают, что вы устанавливаете семя один раз, а затем генерируете длинную последовательность чисел. Единственное, что похоже на то, что я видел до сих пор, это Perlin Noise, но он генерирует слишком «плавные» данные - для подобных входов он имеет тенденцию давать аналогичные результаты.Быстрое генератор псевдослучайных чисел для процедурного содержания
Декларация генератора должна выглядеть примерно так:
int RandomNumber1(int seed);
Или:
int RandomNumber3(int seedX, int seedY, int seedZ);
Я думаю, что имея хороший RandomNumber1 должно быть достаточно, как можно реализовать RandomNumber3 путем хеширования свои входы и передать результат в RandomNumber1, но я написал 2-й прототип в случае, если какая-то реализация может использовать независимые входы.
Предполагаемое использование для этого генератора - использовать его для генератора процедурного содержимого, например, для создания леса путем размещения деревьев в сетке и определения случайных видов деревьев и случайных пространственных смещений для каждого местоположения.
Генератор должен быть очень эффективным (ниже 500 циклов ЦП), поскольку процедурный контент создается в огромных количествах в реальном времени во время рендеринга.
Причины шум Перлина похож на то, что вы просите, что Перлин шум использует детерминированную (повторяемую) функцию псевдослучайной сделать часть своей работы (а затем сглаживает результат). Если вы посмотрите на реализацию шума Perlin, особенно более ранние, предварительно улучшенные, вы часто найдете тип эффективной, повторяемой «случайной» функции, которую вы ищете, хотя язык, домен и диапазон будут различаться. Например. `RandomNumber (vec2 seed, float x, float y) {return fract (sin (точка (семя + vec2 (fx, fy), vec2 (12.9898,78.233))) * 43758.5453); } `(GLSL ES) – LarsH 2017-01-05 16:18:42
Я тоже пытался исследовать этот вопрос, и пришел к выводу, что слово« генератор »подразумевает последовательное, потоковое поведение, которое мы пытаемся избежать. Вот почему PRN ** G ** обычно понимается как предоставление «функций» с точки зрения состояния, а не строго детерминированных. Может быть, у нас был бы лучший успех в исследовании, если бы мы искали PRNF (функцию), а не PRNG. https://blogs.unity3d.com/2015/01/07/a-primer-on-repeatable-random-numbers/ называет их «случайными хэш-функциями». – LarsH 2017-01-05 16:27:33