所需算法:Javascript中可预测的随机化瓷砖

时间:2013-05-17 20:27:54

标签: javascript algorithm random

这是函数定义:

/**
 * @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)开始并且将以他想要的任何方向向外移动 - 我将只有固定数量的"地面" - 我希望它能让每次加载游戏时世界看起来都一样。

2 个答案:

答案 0 :(得分:2)

如果你想引入“可预测的随机性”,那么听起来你想要一个哈希。可预测的随机性是一种矛盾,因为真正的随机性是不可预测的,所以我们称之为未知但确定性。

算法如下所示:

  1. 使用算法(SHA-256,md5等)来散列一些唯一值 对于给定的位置(x*Y)对我来说听起来不错(但是这会 引入一些对称性 - (1,1)地图与(-1 -1)
  2. 相同
  3. 使用返回值的某些属性返回tileCount 数
    • 也许sum(bits of hash) % tileCount
  4. 为解决对称性问题,您可以在x和y上添加一个大数字,以便对称性发生在几乎不可能的遥远位置。这样:

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

    或者你可以使用sum(hash(x)+ hash(y))来消除对称性,但是太多的哈希算法会变得缓慢而笨重。

答案 1 :(得分:0)

我建议你使用一个动态创建图块的函数,然后将它们保存在一个对象中。 因此,每次调用该函数时,它都将从创建的对象返回值。 要保存对象,如果要创建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;
 }