2013-05-17 49 views
0

下面是函數的定義:算法所需:可預測的隨機瓷磚在Javascript

/** 
* @param {number} x The x-coordinate (can be positive or negative) 
* @param {number} y The y-coordinate (can be positive or negative) 
* @param {number} tileCount The number of available tiles 
* @return {number} The selected tile index 
*/ 
function getRandomTileIndex(x, y, tileCount) { 
    // Fill in code here 
} 

我可以,例如,return x * y % tileCount,但我要爲大家介紹的隨機性。我可以做return Math.round(Math.random() * (tileCount-1)),但那麼每次都會返回不同的瓦片索引。

我希望此功能是確定性的,所以當使用相同的輸入(x, y, tileCount)時,總是會發生相同的輸出。但我也希望它(儘可能)顯示爲隨機分佈均勻 - 隨機性的質量不一定是完美的。

這個隨機瓷磚發生器的目的是爲了一個(幾乎)無限網格的遊戲 - 用戶在中間(x,y) = (0,0)開始,並將向任何方向向外移動 - 我只有固定數量的背景拼圖「地面」 - 我希望它能讓你每次載入遊戲時都看起來一樣。

+1

檢查這個職位:http://stackoverflow.com/questions/424292/how-to-create-my-own-javascript-random-number -generator-that-i-can-also-set- – Sam

+0

感謝Sam對那個有用的鏈接 - 我認爲seedrandom正是我所需要的。 – codefactor

回答

2

如果你想引入「可預測的隨機性」,那麼聽起來就像你想要一個散列。可預測的隨機性是一種矛盾,因爲真正的隨機性不可預測,所以我們稱之爲未知但確定性的。

的算法是這樣的:

  1. 使用的算法(SHA-256,md5等)哈希一些獨特的價值 對於給定的位置(x*Y)聽起來不錯(不過這將01​​介紹一些對稱 - (1,1)映射到相同(-1 -1)
  2. 使用返回值的某些屬性返回tileCount 數
    • 也許sum(bits of hash) % tileCount

爲了解決這個對稱問題,你可以使對稱發生在一個幾乎不可能遙遠地方的大量增加x和y。所以:

hashVal = hash((x+53562345)*(y-235734093)) 
tileType = sum(hashVal bits) % tileCount 

,或者您可以使用SUM(散列(X)+哈希(Y)),這將消除對稱,但太多的哈希算法可以得到緩慢而笨重。

+1

»可預測的隨機性«也可以指PRNG。 – Joey

+0

@ajon我同意矛盾論。這是一個好主意 - 我想知道如何生成給定x,y的唯一編號的方法具有對稱性getRandomTileIndex(-1,-1,100)== getRandomTileIndex(1,1,100)'會對我嘗試創建的效果造成破壞性影響。 – codefactor

+0

@Joey,是的,我只是指這個短語在語言上不起作用的事實。在行業prng授予被稱爲可預測的隨機。 – ajon

0

我會建議你使用一個函數來創建tiles dynamicaly並將它們保存在一個對象中。 所以每次調用該函數時,它都會返回創建對象的值。 如果您想要創建HTML5遊戲,爲了保存對象,您也可以使用HTML5本地存儲來保存持久性。


的建議是:

/** 
* @param {number} x The x-coordinate (can be positive or negative) 
* @param {number} y The y-coordinate (can be positive or negative) 
* @param {number} tileCount The number of available tiles 
* @return {number} The selected tile index 
*/ 
var tiles = {}; 
function getRandomTileIndex(x, y, tileCount) { 
    var tile; 
    if(tiles[x][y]) { 
     tile = tiles[x][y]; 
    } 
    else { 
     tile = Math.round(Math.random() * (tileCount)); 
     tiles[x][y] = tile; 
    } 
    return tile; 
} 
+0

這是一個很好的嘗試 - 但就像我說世界是(幾乎)無限的 - 我希望它是確定性的,所以每個人都看到相同的世界(不管是哪個系統,或者如果他們已經清除緩存,打開不同的瀏覽器, etc) – codefactor

+0

另一個注意事項:用戶將在世界上構建東西,其他人將會看到,並且他們可能會根據他們看到的背景來構建東西 - 因此重要的是每個人都看到相同的東西。 – codefactor

+0

@codefactor所以你想創建一個大的地圖,這將動態消耗? –