2009-06-17 7 views
6

私は現時点で頂点シェーダーを書いていますが、乱数が必要です。頂点シェーダハードウェアには論理/ビット演算がないため、標準の乱数生成器は実装できません。 標準的な算術だけを使って乱数ジェネレータを作ることはできますか?ランダム性は特に優れている必要はありません!ビット操作を使わない乱数生成

答えて

5

あなたが安っぽいランダム性を気にしない場合は、古典的な方法は、CおよびNは定数である

x[n+1] = (x[n] * x[n] + C) mod N 

、C!= 0であり、C!= -2、およびNは素数です。これは、Pollard Rhoの因数分解のための典型的な擬似ランダム生成器です。試してみてくださいC = 1とN = 8051、それらは正常に動作します。

+0

これは十分にランダムなようですが、よかった! – Martin

+0

あなたはグラフィックスのために大きな統計的品質を必要としません。 –

2

頂点シェーダには、cgのnoise()関数など、組み込みのノイズジェネレータが組み込まれていることがあります。

+0

HLSLには私が使用できるノイズ関数があります: http://msdn.microsoft.com/en-us/library/bb509629(VS.85).aspx しかし、過去に使ったときはいつでも実際には最近まで私はそれが "まだ実装されていない"とマークされたと信じています! – Martin

2

使用することは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 
2

は信じられないかもしれませんが、私が使用newx = oldx * 5 + 1(またはそれのわずかな変化)いくつかのビデオゲームインチランダム性は恐ろしく、ランダムなジェネレータよりもスクランブルされたシーケンスのほうが多いです。しかし、時にはそれだけで必要なのです。私が正しく思い出すと、それは繰り返される前にすべての数字を通ります。

これにはいくつかのひどい特徴があります。同じ番号を連続して2回も出すことはありません。私たちのいくつかはそれのバリエーションについてたくさんのテストを行い、他のゲームでいくつかのバリエーションを使用しました。

私たちが利用できる良いモジュロがないときに使用しました。これは、2つの追加(または5つの追加と1つの追加)による単なるシフトです。私は今日は乱数のために使用しないでしょう - 私はLCGを使用しましたが、速度が重要で命令セットが限られているかもしれないシェーダに対してはうまくいくでしょう。

+0

hehe、それは興味深いRNGです。数学的には分かりやすく、私は確かに見ました! スピードが重視されるので、私はこれで遊びます。 – Martin