javascript - 所需算法 : Predictable Randomized Tiles in Javascript

标签 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)) 但是每次都会返回不同的图 block 索引。

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

这个随机图 block 生成器的目的是用于具有(几乎)无限网格的游戏 - 用户从中间 (x,y) = (0,0) 开始,然后向外移动无论他想要什么方向 - 我只会为“地面”提供固定数量的背景图 block - 我想要它以便每次加载游戏时世界看起来都一样。

最佳答案

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

算法如下所示:

  1. 使用算法(SHA-256、md5 等)对某些唯一值进行散列 对于给定的位置 (x*Y) 对我来说听起来不错(但是这会 引入一些对称性——(1,1) 映射到与 (-1 -1)
  2. 相同的位置
  3. 使用返回值的一些属性返回一个tileCount 数字
    • 也许 sum(bits of hash) % tileCount

要解决对称性问题,您可以在 x 和 y 上加上一个大数,这样对称性就会发生在几乎不可能遥远的位置。所以:

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

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

关于javascript - 所需算法 : Predictable Randomized Tiles in Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16617348/

相关文章:

javascript - Youtube - 自定义播放图标

algorithm - 在有序列表中搜索

c++ - 如何随机化排序列表?

random - urandom_range(), urandom(), verilog 中的 random()

javascript - 一段时间后隐藏的 Div 不显示

javascript - 为什么 Immutable.js 在 Map.setIn() 上抛出无效的键路径

algorithm - 解决复发

c++ - 我可以将一个随机引擎分配给一个变量而无需到处都有模板变量吗?

javascript - 我如何在 forEach 中使用 set timeout 和 promise/dynamoDB delete?

c - 打印日历月