Я пишу шейдер, который иногда заставляет точки на 2D-карте блестеть. («Сияние» - это просто более яркий пиксель.) Я бы хотел, чтобы блестящие блоки отображались случайным и равномерно распределенным на (бесконечной) плоскости, но я хочу, чтобы мерцание было детерминированным на основе координат X и Y.Я попытался создать начальное число из координат и создать Java Random
из этого начального числа, но до сих пор мои попытки приводили к распознаваемым образцам. Эта функция будет вызываться часто (много миллионов раз), поэтому производительность имеет решающее значение.
Сначала я попытался имитировать мою реализацию hashCode ()
, в которой во избежание коллизий используется множитель простых чисел. Это привело к появлению видимой пропасти на карте, где несколько точек имели одно и то же семя.
Затем я попытался создать начальное число, объединив координаты следующим образом:
long seed = ((long) x << 32) | (long) y;
Random rand = new Random(seed);
Похоже, это тоже приводит к шаблонным данным, хотя шаблон не так очевиден. Выбранные координаты отображаются в виде линий, которые не распределены равномерно.
Я избегал использования MD5 или других алгоритмов криптографического хеширования, потому что опасаюсь снижения производительности.