私は現時点で頂点シェーダーを書いていますが、乱数が必要です。頂点シェーダハードウェアには論理/ビット演算がないため、標準の乱数生成器は実装できません。 標準的な算術だけを使って乱数ジェネレータを作ることはできますか?ランダム性は特に優れている必要はありません!ビット操作を使わない乱数生成
答えて
あなたが安っぽいランダム性を気にしない場合は、古典的な方法は、CおよびNは定数である
x[n+1] = (x[n] * x[n] + C) mod N
、C!= 0であり、C!= -2、およびNは素数です。これは、Pollard Rhoの因数分解のための典型的な擬似ランダム生成器です。試してみてくださいC = 1とN = 8051、それらは正常に動作します。
頂点シェーダには、cgのnoise()
関数など、組み込みのノイズジェネレータが組み込まれていることがあります。
HLSLには私が使用できるノイズ関数があります: http://msdn.microsoft.com/en-us/library/bb509629(VS.85).aspx しかし、過去に使ったときはいつでも実際には最近まで私はそれが "まだ実装されていない"とマークされたと信じています! – Martin
使用することはlinear congruential generator:
X_(n+1) = (a * X_n + c) mod m
者はその強力ではありませんが、少なくとも彼らはよく知られており、長い期間を持つことができます。 Wikipediaのページには、また、良好な提言があります
一般LCGの期間は最大で メートルで、それよりもはるかに少ないのいくつかの選択肢のための 。 LCGがいっぱい 期間の場合に限りがあります:
1. c and m are relatively prime, 2. a - 1 is divisible by all prime factors of m, 3. a - 1 is a multiple of 4 if m is a multiple of 4
は信じられないかもしれませんが、私が使用newx = oldx * 5 + 1(またはそれのわずかな変化)いくつかのビデオゲームインチランダム性は恐ろしく、ランダムなジェネレータよりもスクランブルされたシーケンスのほうが多いです。しかし、時にはそれだけで必要なのです。私が正しく思い出すと、それは繰り返される前にすべての数字を通ります。
これにはいくつかのひどい特徴があります。同じ番号を連続して2回も出すことはありません。私たちのいくつかはそれのバリエーションについてたくさんのテストを行い、他のゲームでいくつかのバリエーションを使用しました。
私たちが利用できる良いモジュロがないときに使用しました。これは、2つの追加(または5つの追加と1つの追加)による単なるシフトです。私は今日は乱数のために使用しないでしょう - 私はLCGを使用しましたが、速度が重要で命令セットが限られているかもしれないシェーダに対してはうまくいくでしょう。
hehe、それは興味深いRNGです。数学的には分かりやすく、私は確かに見ました! スピードが重視されるので、私はこれで遊びます。 – Martin
- 1. 乱数生成器 - 毎回乱数を生成しない
- 2. なぜ乱数(塩を使わないで)乱数?
- 3. PHP繰り返しを使わないで乱数を生成する
- 4. 繰り返しを使わずに乱数を生成する
- 5. 32ビット整数のビット操作
- 6. ビット操作の代わりに、ビットマップ
- 7. 堅牢な乱数生成
- 8. ビット奇妙な乱数ジェネレータ#
- 9. 乱数生成
- 10. 重複のない乱数の生成
- 11. Java単純なビット操作
- 12. ビット操作による直交信号の生成
- 13. 長いビットのビット操作エラー
- 14. Cビット設定(ビット操作)
- 15. ビット操作AND
- 16. C++ビット操作
- 17. ビット操作
- 18. ビット操作
- 19. Cビット操作
- 20. スパーク - 乱数生成
- 21. 乱数生成器
- 22. Javascript - 乱数生成
- 23. 乱数の生成
- 24. ATMega乱数生成
- 25. 擬似乱数乱数生成器で乱数列を生成する正しい方法
- 26. 乱数配列を操作する
- 27. ビット操作MIPSアセンブリ
- 28. アセンブリのビット操作
- 29. 16進ビット操作
- 30. Delphiのバイト変数の操作ビット
これは十分にランダムなようですが、よかった! – Martin
あなたはグラフィックスのために大きな統計的品質を必要としません。 –