需要的算法:Javascript中可预测的随机分片

需要的算法:Javascript中可预测的随机分片,javascript,algorithm,random,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 inde

以下是函数定义:

/**
 * @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
 }
例如,我可以
返回x*y%tileCount
,但我想引入随机性。我可以做
返回Math.round(Math.random()*(tileCount-1))
但是每次都会返回不同的tile索引

我希望这个函数是确定性的,所以当使用相同的输入
(x,y,tileCount)
时,总是会出现相同的输出。但我也希望它看起来(尽可能)是随机的,分布均匀——随机性的质量不一定是完美的

<> P>这个随机瓦片生成器的目的是为一个游戏(几乎)无限网格-用户开始在中间<代码>(x,y)=(0,0)< /代码>,并将向外移动在任何他想要的方向-我只会有固定数量的背景砖为“地”-我希望这样,每次加载游戏时,世界看起来都是一样的。

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

算法如下所示:

  • 使用算法(SHA-256等)散列某些唯一值 对于给定的位置
    (x*Y)
    听起来不错(不过 引入一些对称--
    (1,1)
    映射到与
    (-1-1)
  • 使用返回值的某些属性返回tileCount 数
    • 可能
      sum(散列位)%tileCount
  • 为了解决对称性问题,您可以在x和y上添加一个较大的数字,以便对称发生在几乎不可能遥远的位置上。因此:

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

    或者你可以使用sum(散列(x)+散列(y))来消除对称性,但是过多的散列算法可能会变得缓慢和笨拙。

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

    查看此帖子:感谢Sam提供的有用链接-我认为seedrandom正是我所需要的。»可预测的随机性«也可以指PRNG。@ajon我同意矛盾修饰法。这是个好主意-我想知道如何在给定x,y的情况下生成唯一的数字…具有对称性
    getRandomTileIndex(-1,-1100)==getRandomTileIndex(1,1100)
    会对我试图创造的效果造成毁灭性的影响。@Joey,是的,我只是指这个短语在语言上不起作用的事实。在行业中,prng被称为可预测的随机。@codefactor请参阅我的补充内容以解决对称性问题。@ajon你认为
    hashVal=hash会发生什么(x*53562345+y)
    ?这是一个很好的尝试——但正如我所说的,世界(几乎)是无限的——我希望它是确定性的,因此每个人都看到相同的世界(无论哪个系统,或者他们是否清除了缓存、打开了不同的浏览器等)另一个注意事项:用户将在世界上构建其他人会看到的东西,而且他们很可能会根据他们看到的背景构建东西-因此每个人都看到相同的东西是很重要的。@codefactor所以你想创建一个大地图,它将动态扩展?我有一个以(0,0)为中心的网格当你向外移动时,我会根据方向将网格向左/向右/向上/向下移动。人们建造的东西会有从中心开始的相对坐标-我想用这些随机瓷砖绘制背景-但我希望它总是一样的。