DioD
offline
Опыт:
45,184Активность: |
Pool (no vJass no cJass no ZINC)
Обкаточная версия.
В первую очередь предназначена для выдачи случайных последовательностей чисел без повторений, а также выдачи случайных чисел с дополнительным шансом. Сама идея нагло украдена у буржуев, но код переписан чуть больше чем полностью (даже аллокатор свой). Пока что все значения хардкодед, 64 пула по 127 значений в каждом + 62 слота под метаданные, (два заняты изначально) выделение и сохранение метаданных не очень то и контролируется, так что туда можно писать что угодно в каком угодно порядке и система эти метаданные трогать не будет. В ближайшее время планируется включить метаданные в общую обработку (увеличив размер пула до 187 чисел), подтянуть автоматическую (и не очень) склейку пулов в более большие. Код:
Ну и собственно пример использования и применения. Код:
При выполнении этого кода будет создано 4 героя из набора при этом ни один герой не повториться. Блудмаг будет появляться самым последним, так как шанс его выпадение в 100 раз меньше чем у остальных героев, первые три героя появляются с равной вероятностью. |
22.01.2010, 07:03 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Распиши пожалуйста все команды нужные для пользования, а то я по твоему примеру не все понял
DoctorGester добавил: А хотя все понял, не понял только предназначение F_NULL |
22.01.2010, 09:24 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
F_NULL это переменная содержащая число 0x27BC86AA которое указывает на то вызов провалился.
вторую версию опубликую с комментариями. |
24.01.2010, 10:41 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FunkieFoO
offline
Опыт:
7,059Активность: |
давно пора создать раздел под фишечки бай Диод... а где это можно применить? типо при раздаче "правильных" рандомов али какЪ? |
24.01.2010, 11:22 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
да где угодно это можно применить, это тут 64 пула по 128, если подключить 10 массивов то будет 320 пулов (что больше чем много) по 256 чего за глаза хватит на любые задачи, вплоть до выдаче пасивок с мультиэффектом. |
24.01.2010, 11:49 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
То что есть шанс выпадения это классно. Наверно даже использую систему в своей карте. |
24.01.2010, 18:29 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
не советую так как система будет переписана чуть больше чем полностью очень скоро. |
24.01.2010, 19:23 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Rewenger
The culprit will not die
offline
Опыт:
35,273Активность: |
Да, версия с комментариями была бы очень кстати. Теоретически полезная штука, но разбираться без пояснений - не самое приятное занятие. Отредактировано Rewenger, 24.01.2010 в 21:13. |
24.01.2010, 21:08 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
iZucken
ШТО
offline
Опыт:
17,960Активность: |
Ммм, т.е. это все по сути просто рандомно размешивает данные? |
24.01.2010, 21:47 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
DioD, ок, ждемс новой версии Q_w_e_r_t_y, по сути это размешивает те данные, которые ты хочешь, с шансом выпадения, и без выпадения одинаковых данных |
24.01.2010, 22:32 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
iZucken
ШТО
offline
Опыт:
17,960Активность: |
DoctorGester, ну да, я так это и мел ввиду ^^ |
25.01.2010, 05:27 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
ожидайте всё будет. |
25.01.2010, 08:03 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
Уважаемый DioD!! объясни мне пожалуйста что нужно для того чтоб подключить это в свою карту, плюс, как воспользоваться этим )) , чтоб получать рандомное число от 1до100 и чтоб у каждого числа были равные шансы выпасть.
да, и насколько быстро это будет работать?? Отредактировано ManWhoKnows, 07.02.2010 в 04:35. |
07.02.2010, 04:30 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
Для подключения достаточно скопировать данный код в любой триггер, для этого само собой требуется НьюГен редактор.
можно присваивать циклом, максимальный размер пула в этой версии 127. |
07.02.2010, 10:55 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
окей, а потом вызываем set СЛУЧАЙНОЕ_ЧИСЛО = POOL_RND_INT(A) так? да, и насколько быстро это будет работать? (на каждое получение урона мне необходимо рандомное число, число воинствующих юнитов у меня на карте примерно в 1,5-2 раза больше чем максимальное кол-во оных в стандартной игре.) |
07.02.2010, 13:28 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
посчитай сам насколько это быстро у тебя перед глазами сорц. |
07.02.2010, 13:30 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ManWhoKnows
just another wc3 modmaker
offline
Опыт:
915Активность: |
а создателю кода не проще это сказать а если я тупой нуб, никак вот не могу разобрать кода? (честно, я не понимаю что значит " != " ). в общем я думаю что POOL_RND_INT() немного медленней чем просто стандартный гетрандом, но в функции есть цикл, а это меня загоняет в тупик(насколько он может замедлить выполнение). Я привёл ситуацию в которой описано с какой частотой мне нужно вызывать POOL_RND_INT() , не проще ли автору сего произведения дать ответ |
07.02.2010, 22:34 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
не стоит думать о скорости, особенно когда не понимаешь что да как.
этот алгоритм предельно быстрый, быстрее на джаз не сделать. |
07.02.2010, 22:43 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Windrunner
Верь мне!
offline
Опыт:
4,565Активность: |
Я щас проверил с тем что дано в примере с помощью тупого вывода числа.Выдает 1 и те же числа.
Или мб я в чем-то ошибся но выдает все же=) Тут стоят нули так как f_NULL не хотел мой редактор воспринимать local integer A = POOL_NEW() local integer B = 0 local integer C = 0 call POOL_ADD_INT(A,'Hpal',10 ) call POOL_ADD_INT(A,'Hamg',10 ) call POOL_ADD_INT(A,'Hmkg',10 ) call POOL_ADD_INT(A,'Hblm',0.1) set B = POOL_COPY(A) loop set C = POOL_RND_INT(A) call POOL_REM_INT(A,C) BJDebugMsg(I2S(C)) exitwhen C == 0 endloop loop set C = POOL_RND_INT(B) call POOL_REM_INT(B,C) BJDebugMsg(I2S(C)) exitwhen C == 0 endloop |
15.03.2010, 07:45 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YellowStar
poon
offline
Опыт:
15,144Активность: |
а ты сделаи значения рандома в редакторе не жесткими и не парься. |
15.03.2010, 12:30 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|