XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
DioD

offline
Опыт: 45,134
Активность:
Рандом
Значит так, есть некий массив регионов 32*32 (это самая маленькая ячейка)
Коих у меня 8192, не спрашивайте как я их забивал в массив, это не понять.
Суть вопроса в том, что если используя рандом интегер
(0,8192) один и тот-же регион не попадал дважды, у меня было предположение каждый раз перезаписывать данные массива в другой массив и уменьшать рандом сид на 1, а полученый регион из массива удалять.
Но увы не прокатило, есть идеи?
Старый 18.06.2006, 03:17
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
А может вот так сматри:
значит рандом(0,8192)
глобалки:

Код:
udg_fre (integer) (array)
udg_frenum (integer)


собсна действие:
Код:
function o takes nothing returns integer
local integer max=8192
local integer rnd= GetRandomInteger(0,max)
local integer i=0
local boolean flag=false

loop
exitwhen i>udg_freenum
 if (rnd==udg_fre) then
  set flag=true
 endif
set i=i+1
endloop

if (not(flag))
 udg_freenum=udg_freenum+1
 udg_free[udg_freenum]=rnd
 return rnd
else
 return 0
endif
endfunction


Я еще не проверял ругается ли редактор, ибо написал его на лету, но я проверю *)
кароч идея в том что в глобалке udg_frenum хранится число уже выпаденных чисел
а в массиве udg_fre само число (индексом у него служит udg_frenum для того чтобы записать следующее...)
При проверке массив обходется циклом (udg_frenum будет числом интераций цикла)
и если в массиве обнаруживается тока что выпавшее число возвр ноль, я ща попробую сделать код поумней, погади ка...
в общем проверь...

=====================[i]bugmaker добавил:
============================
Забудь про то что я тебе в предыдущем посте выложил, эта лучше :D
значи так...

udg_array - логическая - массив

Код:
function GetFreeRand takes nothing returns integer
 local integer i=0
 local integer k=0
 local integer array p
 local integer rnd
 
 loop
 exitwhen i>8192
  if not(udg_array[i]) then
   set k=k+1
   set p[k]=i
  endif
 set i=i+1
 endloop

 set rnd= p[GetRandomInt(1,k)]
 set udg_array[rnd]= true
 return rnd
endfunction


Я не знаю будет ли тормазить когда будет обходить цикл с 8192 интерациями, но помоему это лучше чем прошлый... ди и я его проверил в ВЕ, работает...

Отредактировано bugmaker, 18.06.2006 в 16:01.
Старый 18.06.2006, 15:26
DioD

offline
Опыт: 45,134
Активность:
Значит так, я решил проблему, причём сам, даже удивился простоте решения.
Нам потребуется 3 переменные или РБ КЕШ (ну это для извращенцев)
1 массив юнитов или регионов или чисел, заполненый
2 значение МАКС, последнее число массива будь то 100 или 1000
3 РАНДОМ СИД переменная сюда будет записано рандом число между 0 и МАКС
после мы переносим последнюю запись на место выпавшей (будет выкидышь если выпадет последнее число, хотя для этого надо просто сравнить МАКС и СИД если совпадает просто понизить МАКС на 1)
Ну и после переноси уменьшаем макс на 1 и очищаем переменную
Старый 18.06.2006, 16:25
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
интересно... Оказалось решение проблеммы такое простое(как говарица чем проще тем лучше (или краткость моя сестра :P))...молодца... Ща попробцю реализовать (от нефик делать)
Старый 18.06.2006, 16:33
DioD

offline
Опыт: 45,134
Активность:
Я всё уже проверил, не выкидывает и не глючит, шанс медленно повышается для массива в 8000 юнитов не лагает, работает превосходно, реализовано лучше чем в доте, я открыл код и удивился.
Старый 18.06.2006, 16:36
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 21:42.