Как я могу детерминированно создать псевдослучайный узор из координат X / Y?

Я пишу шейдер, который иногда заставляет точки на 2D-карте блестеть. («Сияние» - это просто более яркий пиксель.) Я бы хотел, чтобы блестящие блоки отображались случайным и равномерно распределенным на (бесконечной) плоскости, но я хочу, чтобы мерцание было детерминированным на основе координат X и Y.Я попытался создать начальное число из координат и создать Java Random из этого начального числа, но до сих пор мои попытки приводили к распознаваемым образцам. Эта функция будет вызываться часто (много миллионов раз), поэтому производительность имеет решающее значение.

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

Затем я попытался создать начальное число, объединив координаты следующим образом:

long seed = ((long) x << 32) | (long) y;
Random rand = new Random(seed);

Похоже, это тоже приводит к шаблонным данным, хотя шаблон не так очевиден. Выбранные координаты отображаются в виде линий, которые не распределены равномерно.

Я избегал использования MD5 или других алгоритмов криптографического хеширования, потому что опасаюсь снижения производительности.

5
задан Henry Merriam 13 January 2012 в 02:55
поделиться