vfinsider
offline
Опыт:
740Активность: |
Случайный герой
Вот у меня вопрос как можно выбирать случано например из 10 героев когда 5 из них уже взяты. Т.е например герои под номером 1,5,7,8,9 уже взяты, а 6 игрок берет рандомом героя из оставшегося списка. Если давать ему рандомом от (1 до 10) то ведь рандом может попасть как раз уже взятых персов. Даже если будем продолжать цикл до того момента пока рандом не попадет в оставшихся героев, которые еще имеются в таверне, то сколько он может совершить бессмысленных циклов. Думаю это не совсем оптимально. Есть ли другой способ? |
08.02.2012, 16:51 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
Если уже есть взятые, сначала сделай (из твоего примера):
а это сам пример рандома с памятью
Отредактировано ScorpioT1000, 08.02.2012 в 17:31. |
08.02.2012, 17:08 | #2
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Dartek
Welcome "Deep place"
offline
Опыт:
6,537Активность: |
И как вариант - например если при проверке выясняется что такой герой уже взят - бери героя из следующей/предыдущей ячейки, если она тоже занята - опять следующая, и т.д. Но вариант ScorpioT1000'а лучше, если понимаешь джасс - юзай его. |
08.02.2012, 17:11 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
vfinsider
offline
Опыт:
740Активность: |
ScorpioT1000, я как понял ты берешь например число от 1 до 10 и перезаписываешь все исключая числа (1 5 7 8 9)
1- 2 2- 3 3- 4 4- 6 5- 10 и потом зная сколько чисел было исключено это (5) ты просто рандомишь дальше но уже с перезаписаными данными от 1 до (10-5(исключено))
т.е от 1 до 5? или я не так понял?
vfinsider добавил: Я вот думал чтобы занести всех героев в массив зная сколько героев всего на карте. Первый кто пикает ему рандомится герой GetRandomInt(1,количество всех героев на карте) Потом массив перезаписывается исключая выбранного героя из массива и когда следующий будет рандомить рандом уже пойдет на -1 меньше GetRandomInt(1,количество всех героев на карте-1) И при этом не будет пустых ячеек из за которых появляются бессмысленные циклы во время проверки рандома. |
08.02.2012, 18:03 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
Там всё чуть сложнее,
Другими словами, если простой рандом вернул число, которое уже было, мы ищем числа рядом с ним. Это сильно снижает нагрузку в отличие от полного рандома, а шанс заметить "неполность" этого рандома невелик.
Лучше присвой каждому типу героя какой-то номер и потом просто юзай систему выше) если хочешь, конечно... она хорошо работает Отредактировано ScorpioT1000, 08.02.2012 в 18:23. |
08.02.2012, 18:11 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
vfinsider
offline
Опыт:
740Активность: |
а понял ты рандомишь таким способом.
если рандом попадает в пустую (уже используюнную) ячейку "I" то рассматривается ячейка выше если эта грань, то рассматривается ячейка нижей "I". (ну или наоборот можно сделать кому как нравиться) ну и сооствественно если соседние ячейки заняты то рассматриваются соседи соседей? ну а потом логически идет все дальше пока все ячейки не будут пустыми. vfinsider добавил: если по проще то Dartek, "И как вариант - например если при проверке выясняется что такой герой уже взят - бери героя из следующей/предыдущей ячейки, если она тоже занята - опять следующая, и т.д. Но вариант ScorpioT1000'а лучше, если понимаешь джасс - юзай его." тоже самое |
08.02.2012, 18:24 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
vfinsider, да, либо если всё занято - аварийная очистка =)
ScorpioT1000 добавил:
тут отличие в том, что я пытаюсь брать рандомное число, а в предложении Dartek он просто перебирает с начала. Ну и плюс это всё грамотно написано с минимумом операций. Это можно сравнить с падением шариков - если под лежащим шаром что-то уже лежит, он падает рядом)
Ну и можно юзать отрицательные числа... |
08.02.2012, 18:25 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
vfinsider
offline
Опыт:
740Активность: |
но еще лучше если определять рандомо идти ли нам +1 или на -1 это думаю будет еще рандомнее
vfinsider добавил: ладно спс ты мне помог определится. а написать я напишу сам и немного по другому. тему можно закрывать. |
08.02.2012, 18:40 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
тогда надо будет дополнительную память, "куда мы уже сходили до этого" (сейчас хватает тока tmp) закрыто |
08.02.2012, 18:48 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
alpha, автор просил снова открыть, некогда писать было... |
09.02.2012, 14:25 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
vfinsider
offline
Опыт:
740Активность: |
Я думаю сделал по проще.
В начале заношу всех героев в массив под глобальным индексом (чтоб потом можно было ссылатся и знать сколько героев на карте)
Далее при выборе какого либо героя, зная какой это юнит и под какой ячейкой он записан, удаляем его из массива.
При этом зная сколько у нас героев на карте берем последнего и записываем в пустую ячейку, сокращяя при этом сам массив.
То есть при следующим поиске рандомного героя не надо будет боятся пустующей клетки в массиве, мы можем также рандомить, но уже из меньшего списка на одну единицу. Отредактировано vfinsider, 09.02.2012 в 15:46. |
09.02.2012, 15:31 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Dreii
define{name=Dreii age=17}
offline
Опыт:
5,246Активность: |
используем unitpool
Код:
ф-ии которые тебе понадобятся weight- отвеяает за частоту рандомизации с помощью ф-ии PlaceRandomUnit |
09.02.2012, 19:03 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|