生成随机数而不使用位操作

时间:2009-06-17 22:38:05

标签: math graphics random

我正在写一个顶点着色器,我需要一些随机数。顶点着色器硬件没有逻辑/位操作,因此我无法实现任何标准随机数生成器。 是否可以仅使用标准算法制作随机数生成器?随机性不一定特别好!

4 个答案:

答案 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 - 但是对于速度至关重要并且指令集可能有限的着色器,它可能会正常工作。