需要的算法: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)< /代码>,并将向外移动在任何他想要的方向-我只会有固定数量的背景砖为“地”-我希望这样,每次加载游戏时,世界看起来都是一样的。如果你想引入“可预测的随机性”,那么听起来你想要一个散列。可预测的随机性是一种矛盾修饰法,因为真正的随机性是不可预测的,所以我们称之为未知但确定性
算法如下所示:
(x*Y)
听起来不错(不过
引入一些对称--(1,1)
映射到与(-1-1)
- 可能
sum(散列位)%tileCount
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)为中心的网格当你向外移动时,我会根据方向将网格向左/向右/向上/向下移动。人们建造的东西会有从中心开始的相对坐标-我想用这些随机瓷砖绘制背景-但我希望它总是一样的。