2009-08-12 204 views
1

我试图使用Lua在上描述的Perlin噪声算法。但是,它不能正常工作,因为Lua不支持按位运算符,这对于该页面上的伪随机数函数是必需的。我试着用randomseed()搞乱,但是我能想出的所有东西都只是做出了非常奇怪的模式。我需要一个伪随机数生成器,当给定参数x,y和一个随机种子时,它会生成-1和1之间的数字。伪代码很好。噪声伪随机数发生器

谢谢!

回答

5

已经有这个做Lua库,一个我发现是: lrandom

它使用可满足您的需求更好地梅森倍捻机算法。

+0

我找不到链接进行。另外,这只是一个游戏脚本(侧面项目),所以我无法安装C库。 – phpscriptcoder 2009-08-13 01:03:14

+1

链接在那里:http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/5.1/lrandom.tar.gz但如果你不能使用C库,它不会帮助你。 – lhf 2009-08-13 01:13:05

0

我不知道任何纯伪随机数问题的Lua解决方案,但您可以尝试使用一些纯粹的Lua位库编写您提到的算法。

我在Wiki找到了这些:

  • LuaBit是LIB完全写在Lua按位操作。支持的按位操作是:不,和,或,异或,右移和左移。几个实用程序:十六进制到十进制,utf8到usc2和诺基亚.nfb到txt。
  • BitUtils是完全在Lua中实现的按位操作。
  • Module Compress Deflate包括bit.numberlua,它将纯Lua中按位运算实现为数字。
+0

我让LuaBit工作。虽然... 函数noise1(x,y) \t n = x + y * 57 \t n = bit.blshift(n,13)^ n; (((n *(n * n * 15731 + 789221)+ 1376312589)),2147483647))/ 1073741824.0) \t返回n2; 结束 n本身已经相当大。然后它被转移到左边13。此时它是8或9位数......然后它被提升到第n次方。由此产生的数字非常大以至于变成无穷大,所以函数的最终输出总是1,除非x和y的值很低 – phpscriptcoder 2009-08-13 22:16:55

1

在Lua中很容易制作一个线性同余随机数发生器。一个简单的一种是Park-Miller

function pmrng (x) return math.fmod(x * 16807, 2147483647) end 

这会给你的下一个随机整数[1..2147483646] x后,种子。在这种情况下,使用此整数除以模数2147483647来制作浮点数。

prng_seed = 13579 
function upmrng() prng_seed = pmrng(prng_seed); return prng_seed/2147483647 end 

为了扩展这个-1 .. +1做

upmrng() * 2 - 1