2009-06-17 70 views
6

我正在寫一個頂點着色器,我需要一些隨機數。頂點着色器硬件沒有邏輯/位操作,所以我不能實現任何標準的隨機數生成器。 是否可以使用標準算術來製作一個隨機數發生器?隨機性不一定非常好!不使用位操作的隨機數生成

回答

5

如果你不介意蹩腳的隨機性,經典的方法是

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

其中C和N是常數,C!= 0和C!= -2,N是素數。這是Pollard Rho因子分解的典型僞隨機生成器。嘗試C = 1和N = 8051,那些工作正常。

+0

這似乎是隨機的,謝謝! – Martin 2009-06-17 23:05:09

+0

當然。圖形不需要很好的統計質量。 – 2009-06-17 23:57:56

2

頂點着色器有時會有內置噪聲發生器供您使用,例如cg的noise()函數。

+0

HLSL確實有,我可以用噪聲功能: http://msdn.microsoft.com/en-us/library/bb509629(VS.85).aspx 但是每當我在它的過去使用它從來沒有工作,事實上,直到最近我相信它被標記爲「尚未實施」! – Martin 2009-06-17 23:37:33

2

使用linear congruential generator

X_(n+1) = (a * X_n + c) mod m 

那些沒有那麼強,但至少他們是衆所周知的,可以有很長時間。維基百科頁面還具有良好的建議:

一般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

相信與否,我用下一頁末= oldx * 5 + 1(或它的一個輕微的變化)在幾個視頻遊戲。隨機性是可怕的 - 它比隨機生成器更像是一個亂序序列。但有時候這只是你需要的。如果我沒有記錯,它在重複之前會經歷所有的數字。

它有一些可怕的特點。它不會連續給你兩次相同的數字。我們中的一些人對其變體進行了一系列測試,我們在其他遊戲中使用了一些變體。

我們在沒有好的模數給我們時使用它。這只是一個由兩個和兩個增加(或乘以5和一個添加)的轉變。我現在不會使用它隨機數字 - 我將使用LCG - 但也許這對於速度至關重要且您的指令集可能有限的着色器可以正常工作。