Случайное сканирование по каждой координате

TL;DR Случайный доступ к каждой плитке на тайловой карте.

У меня есть способ генерировать случайные положения плиток, просто заполняя ими весь слой (всего 10x10), а затем запуская forloop, например for (int x = 0; x < 13; x++) { for (int y = 0; y < 11; y++)}}, где я случайным образом удаляю плитки. У меня также есть ограничение на это, которое составляет около 30. Проблема в том, что когда цикл заканчивается, он использует ограничение слева (поскольку он начинается с x=0 y=0, а затем делает x0 x1 x2 x3 . ..). Я пробовал генерировать координаты случайным образом, но это не сработало, потому что не распространяется на все координаты.

Кто-нибудь знает лучшую практику сканирования каждой координаты на карте в случайном порядке?


person Oscar Apeland    schedule 29.05.2013    source источник
comment
Почему вы перебираете 14x12, если карта только 10x10?   -  person Paul R    schedule 29.05.2013
comment
Это 13x11, но я только что вспомнил, что проверяю слишком много. @PaulR   -  person Oscar Apeland    schedule 29.05.2013
comment
Это все еще не соответствует вашему утверждению о том, что сетка имеет размер 10x10 - можете ли вы несколько уточнить свой вопрос - может быть, добавить какой-нибудь (реальный) код?   -  person Paul R    schedule 29.05.2013
comment
@PaulR, я сказал 10x10, чтобы привести пример того, что он маленький, чтобы защитить этот не очень эффективный способ кодирования.   -  person Oscar Apeland    schedule 30.05.2013


Ответы (2)


Нумеруйте свои плитки от 0 до n так, как хотите. Создайте NSMutableIndexSet и добавьте в него все. Используйте генератор случайных чисел, масштабированный по количеству элементов, все еще находящихся в наборе индексов (фактически диапазон от первого до последнего), возьмите один, а затем удалите его из набора. Если случайного числа нет в наборе, сгенерируйте новый be и т. д., пока не найдете его в наборе.

person David H    schedule 29.05.2013

Я думаю, что лучшая практика для достижения этого — двойное хэширование. Чтобы узнать больше, прочитайте эту ссылку: Двойное хеширование. Я постараюсь объяснить это просто.

У вас есть две вспомогательные хэш-функции, которые необходимо предварительно вычислить. И основная хэш-функция, которая будет работать в цикле 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. Для получения дополнительной информации проверьте ссылку.

Надеюсь это поможет. Ваше здоровье.

person Majster    schedule 29.05.2013