Escribo un sombreador que ocasionalmente hace brillar un punto en un mapa 2D. (El "brillo" es simplemente un píxel de color más brillante.) Me gustaría que los bloques destellados aparezcan aleatoria y uniformemente distribuidos en el plano (infinito), pero quiero que el destello sea determinista en función de las coordenadas X e Y. Intenté crear una semilla a partir de las coordenadas y crear una Java Random
de esa semilla, pero mis intentos hasta ahora han resultado en patrones reconocibles. Esta función se llamará con frecuencia (muchos millones de veces) por lo que el rendimiento es crítico.¿Cómo puedo producir un patrón pseudoaleatorio desde las coordenadas X/Y de manera determinista?
Intenté por primera vez imitar mi implementación hashCode()
, que utiliza un multiplicador de número primo para evitar colisiones. Esto resultó en un corte visible en el mapa donde una serie de puntos compartía la misma semilla.
Luego trató de crear una semilla mediante la concatenación de las coordenadas, así:
long seed = ((long) x << 32) | (long) y;
Random rand = new Random(seed);
Este parece ser el resultado de los datos modelados y, aunque el patrón no es tan obvio. Las coordenadas seleccionadas aparecen en líneas, no distribuidas uniformemente.
He evitado usar MD5 u otros algoritmos hash criptográficos porque tengo miedo del impacto en el rendimiento.
Si está generando muchos millones de números pseudoaleatorios de un lcm y trazando en un cuadrado 2-D, entonces puede ver "patrones" reconocibles, a menos que use un generador de cifrado fuerte. Busque k-aviones. Probablemente quiera usar un generador de números pseudoaleatorios congruente no lineal. –