私はときどき2Dマップ上で輝きを出すシェーダーを書いています。 (「輝き」は単に明るい色のピクセルに過ぎません)私は、輝かしいブロックが(無限の)平面上にランダムかつ一様に分布しているようにしたいが、輝きはX座標とY座標に基づいて決定論的であることが望ましい。私は座標からシードを作成し、そのシードからJava Random
を作成しようとしましたが、これまでの試みで認識可能なパターンが生じました。この関数は頻繁に(何百万回も)呼び出されるため、パフォーマンスが重要です。X/Y座標から疑似乱数パターンを確定的に生成する方法はありますか?
最初に私のhashCode()
の実装を模倣しようとしました。この実装では、衝突を避けるために素数乗数が使用されています。その結果、一連のポイントが同じシードを共有している地図全体に目立つガッシュが発生しました。
Iは、次いで、そうのような座標を連結することによって種子を作成しようとした:
long seed = ((long) x << 32) | (long) y;
Random rand = new Random(seed);
パターンとして明らかではないが、これは、同様にパターニングされたデータをもたらすように思われます。選択された座標は、均等に分布していないラインで表示されます。
MD5や他の暗号化ハッシュアルゴリズムを使用することは避けました。これは、パフォーマンスの影響を恐れているためです。
1cmから数百万の擬似乱数を生成し、2次元正方形にプロットすると、強力なジェネレータを使用しない限り、認識可能なパターンがよく見えます。 kプレーンを検索する。あなたは、非線形合同擬似乱数ジェネレータを使いたいと思うでしょう。 –