有没有可能的方法来制作没有任何二元运算符的伪随机数?由于这是一张3D地图,我试图将它作为X和Y的函数,但希望在它们的某个地方包含一个随机种子,所以每次都不一样。我知道你可以使用二元运算符制作这样的噪声函数:
double PerlinNoise::Noise(int x, int y) const
{
int n = x + y * 57;
n = (n << 13) ^ n;
int t = (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff;
return 1.0 - double(t) * 0.931322574615478515625e-9;/// 1073741824.0);
}
但由于我使用lua而不是C ++,我不能使用任何二元运算符。我尝试了很多不同的东西,但没有一个能奏效。的 帮助?
答案 0 :(得分:3)
对于位运算符(我猜你的意思是“二进制”),看一下Bitwise Operators Wiki page,其中包含可以使用的模块列表,如Lua BitOp和{{3 }}
如果您不想自己实现它,请查看模块bitlib,其中包含Perlin噪声的实现。请注意,它是一个正在进行中的C模块。
答案 1 :(得分:1)
如果我没弄错的话,Matt Zucker的FAQ on Perlin noise只使用算术运算符来描述/实现它。它只提到按位运算符作为优化技巧。
您应该实现这两种方式并使用相同的语言/运行时测试它们,以了解速度差异。
答案 2 :(得分:1)
在上面的例程中,没有任何按位运算符不容易转换为算术运算。
&lt;&lt; 13成为* 8192
&amp; 0x7FFFFFFF变为2 ^ 31的mod。
只要溢出不是问题,这应该就是您所需要的。
答案 3 :(得分:0)
它很慢,但你可以通过除法和乘法来模拟这些,我相信。