Sto scrivendo uno shader che occasionalmente fa scintillare un punto su una mappa 2D. (Lo "scintillio" è semplicemente un pixel più luminoso). Vorrei che i blocchi scintillanti appaiano distribuiti in modo casuale e uniforme sul piano (infinito), ma voglio che lo scintillio sia deterministico sulla base delle coordinate X e Y. Ho provato a creare seed dalle coordinate e a creare un Java Random
da quel seme, ma i miei tentativi finora hanno portato a modelli riconoscibili. Questa funzione verrà chiamata frequentemente (molte milioni di volte), quindi le prestazioni sono fondamentali.Come posso produrre un pattern pseudocasuale dalle coordinate X/Y deterministicamente?
Ho prima tentato di simulare l'implementazione hashCode()
, che utilizza un moltiplicatore di numeri primi per evitare collisioni. Ciò ha provocato uno squarcio visibile attraverso la mappa in cui una serie di punti ha condiviso lo stesso seme.
Ho quindi cercato di creare un seme concatenando le coordinate in questo modo:
long seed = ((long) x << 32) | (long) y;
Random rand = new Random(seed);
Questo sembra causare dati fantasia pure, se il modello non è così evidente. Le coordinate selezionate appaiono in linee, non distribuite uniformemente.
Ho evitato di utilizzare MD5 o altri algoritmi di hashing crittografico perché temo l'impatto sulle prestazioni.
se si sta generando molti milioni di pseudo numeri casuali da un LCM e tramando in una piazza 2-D, allora si può ben vedere 'modelli' riconoscibili, a meno che non si utilizza un forte generatore di crittografia. Cerca i k-piani. Probabilmente vuoi usare un generatore di numeri pseudocasuali congruenti non lineari. –