我正在写一个顶点着色器,我需要一些随机数。顶点着色器硬件没有逻辑/位操作,因此我无法实现任何标准随机数生成器。 是否可以仅使用标准算法制作随机数生成器?随机性不一定特别好!
答案 0 :(得分:5)
如果你不介意蹩脚的随机性,那么经典方法就是
x[n+1] = (x[n] * x[n] + C) mod N
其中C和N是常数,C!= 0且C!= -2,N是素数。这是Pollard Rho因子分解的典型伪随机生成器。尝试C = 1和N = 8051,那些工作正常。
答案 1 :(得分:2)
顶点着色器有时会内置噪声生成器供您使用,例如cg的noise()
函数。
答案 2 :(得分:2)
使用linear congruential generator:
X_(n+1) = (a * X_n + c) mod m
那些并不那么强大,但至少它们是众所周知的并且可以有很长的时间。维基百科页面也有很好的建议:
一般LCG的期限最多 m,以及一些少得多的选择 比起那个来说。 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
答案 3 :(得分:2)
信不信由你,我在几个电子游戏中使用了newx = oldx * 5 + 1(或略有变化)。随机性非常糟糕 - 它更像是一个乱码序列而不是随机发生器。但有时这就是你所需要的。如果我没记错的话,它会在重复之前通过所有数字。
它有一些可怕的特征。它不会连续两次给你相同的数字。我们中的一些人对它的变化进行了一系列测试,我们在其他游戏中使用了一些变体。
当我们没有可用的模数时,我们使用它。这只是两个和两个加法的转换(或乘以5和一个加法)。我现在永远不会使用随机数字 - 我会使用LCG - 但是对于速度至关重要并且指令集可能有限的着色器,它可能会正常工作。