随机扫描每个坐标

时间:2013-05-29 10:03:17

标签: ios objective-c random cocos2d-iphone arc4random

TL; DR随机访问tilemap中的每个tile

我有一种方法可以通过填充整个图层(只有10x10)来生成图块的随机位置,然后运行像for}}这样的for (int x = 0; x < 13; x++) { for (int y = 0; y < 11; y++)循环 我随机删除瓷砖的地方。我也有一个上限,约为30.问题是,当循环结束时,它会用尽左边的上限(因为它从x = 0 y = 0开始,然后x0 x1 x2 x3。 ..)。我尝试随机生成坐标,但这不起作用,因为它没有遍历所有坐标。

有人知道以随机顺序扫描地图中每个坐标的更好做法吗?

2 个答案:

答案 0 :(得分:1)

将瓷砖0到n编号,无论如何。创建一个NSMutableIndexSet,并将其全部添加到其中。使用随机数生成器缩放到仍然在索引集中的项目数(实际上是从头到尾的范围),抓取一个,然后从集中删除它。如果随机数不在集合中,则生成新的be等,直到在集合中找到一个。

答案 1 :(得分:1)

我认为实现这一目标的最佳做法是通过双重散列。要了解更多信息,请阅读此链接:Double Hashing。我会尽力解释一下。

您有两个需要预先计算的辅助哈希函数。以及将在for循环中运行的主哈希函数。让我们测试一下(这将是伪代码):

key = random_number() //lets get a random number and call it "key"
module = map_size_x // map size for our module

//form of hash function 1 is: h1(key) = key % module, lets compute the hash 1 for our main hash function
aux1 = key % module
//form of hash function 2 is: h2(key) = 1 + (key % module'), where module' is module smaller for a small number (lets use 1), lets compute it:
aux2 = 1 + (key % (module - 1))

//the main hash function which will generate a random permutation is in the form of: h(key, index) = (h1(key) + index*h2(key)) % module. we already have h1 and h2 so lets loop this through:
for (i = 0; i < map_size_x; i++)
{
     randomElement = (aux1 + i*aux2) % module //here we have index of the random element
     //DO STUFF HERE
}

要获得另一种排列,只需更改key的值即可。有关详细信息,请查看链接。

希望这会有所帮助。欢呼声。