2009-08-12 149 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