2D マップ上で時折点を輝かせるシェーダーを作成しています。(「きらめき」は単に明るい色のピクセルです。) きらめくブロックを (無限の) 平面上にランダムかつ均一に分散させて表示したいのですが、X 座標と Y 座標に基づいてきらめきを決定論的にしたいと考えています。座標からシードを作成し、そのシードから Java を作成しようとしましたRandom
が、これまでのところ、認識可能なパターンが得られました。この関数は頻繁に (何百万回も) 呼び出されるため、パフォーマンスが重要です。
hashCode()
最初に、素数乗数を使用して衝突を回避する実装を模倣しようとしました。これにより、一連のポイントが同じシードを共有するマップ全体に目に見える切り傷が生じました。
次に、次のように座標を連結してシードを作成しようとしました。
long seed = ((long) x << 32) | (long) y;
Random rand = new Random(seed);
パターンは明らかではありませんが、これもパターン化されたデータになるようです。選択した座標が一列に表示され、均等に配置されていません。
パフォーマンスへの影響が懸念されるため、MD5 やその他の暗号化ハッシュ アルゴリズムの使用は避けています。