我正在寫一個頂點着色器,我需要一些隨機數。頂點着色器硬件沒有邏輯/位操作,所以我不能實現任何標準的隨機數生成器。 是否可以使用標準算術來製作一個隨機數發生器?隨機性不一定非常好!不使用位操作的隨機數生成
回答
如果你不介意蹩腳的隨機性,經典的方法是
x[n+1] = (x[n] * x[n] + C) mod N
其中C和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 2009-06-17 23:37:33
使用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
相信與否,我用下一頁末= oldx * 5 + 1(或它的一個輕微的變化)在幾個視頻遊戲。隨機性是可怕的 - 它比隨機生成器更像是一個亂序序列。但有時候這只是你需要的。如果我沒有記錯,它在重複之前會經歷所有的數字。
它有一些可怕的特點。它不會連續給你兩次相同的數字。我們中的一些人對其變體進行了一系列測試,我們在其他遊戲中使用了一些變體。
我們在沒有好的模數給我們時使用它。這只是一個由兩個和兩個增加(或乘以5和一個添加)的轉變。我現在不會使用它隨機數字 - 我將使用LCG - 但也許這對於速度至關重要且您的指令集可能有限的着色器可以正常工作。
- 1. 不同的隨機數生成操作系統
- 2. rand()在模操作後不會生成隨機數
- 3. 生成隨機數字不工作
- 4. qrand不生成隨機數
- 5. 在不使用模數或位操作的情況下以腳本語言生成隨機數
- 6. 生成8位唯一隨機數
- 7. 生成一個N位隨機數
- 8. 生成隨機數
- 9. 隨機數生成
- 10. 生成隨機數
- 11. 使用boost :: random的平臺隨機生成一致隨機數
- 12. 隨機數生成機制
- 13. 如何隨機生成隨機64位整數
- 14. 能否使用負數作爲隨機數生成的種子?
- 15. 使用GKRandomSource生成隨機數
- 16. 使用PHP生成隨機數據
- 17. 使用doSMP生成隨機數
- 18. 使用R隨機生成數字
- 19. 使用matlab條件生成隨機數
- 20. 使用Node.js生成隨機數頁面
- 21. 使用Python,ArcGIS 10.1生成隨機數
- 22. 使用rnorm生成隨機數
- 23. 使用capl生成一個隨機數
- 24. 隨機數的生成
- 25. Cuda的隨機數生成
- 26. 如何使用Python生成4位密碼隨機數
- 27. 隨機生成器,種子不工作
- 28. 生成不在列表中的5位數的隨機碼
- 29. 我看不到生成的隨機數
- 30. 生成不同的隨機數
這似乎是隨機的,謝謝! – Martin 2009-06-17 23:05:09
當然。圖形不需要很好的統計質量。 – 2009-06-17 23:57:56