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

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

Ответ
 
nic666

offline
Опыт: 5,612
Активность:
Как создать свой RND генератор?
Чем не устраивает обычный Random?
- Тем что он используется движком или AI в своих целях...

Я проверил свой код, сделал так что тригеры включаются последовательно, накладок быть не может. Но где-то между вызовом моих тригеров выполняются другие, наверное связаные с работой AI и они наверное используют Random в своих целях, мне этого не надо....

Всвязи с чем создаю эту тему.
Если это удастся то можно иметь свой изолированый генератор и никакие AI в него не влезут...


Я опробовал следующий код, в DELPHI он полностью повторяет ГСЧ, тот самый что в нее встроен, но код не сработал в Jasse...
Код:
function RND takes integer a returns integer
local real V

set udg_RandSeed = 1 + (udg_RandSeed * 134775813)

set V = I2R(udg_RandSeed)

 if (udg_RandSeed < 0) then
   set V = V + 4294967296.0
 endif

set V = (V * I2R(a)) / 4294967296.0

return R2I(V)
endfunction



Как я понял после некоторых попыток модификаций в жасе тип real имеет размер 32 бита, как и integer... в делфе это не так, там это 64 бита, или real48 - это 48 бит (и этого даже хватило бы)

Из за плохой реализации real, число 4294967296.0 равно нулю, в результате в строке set V = (V * I2R(a)) / 4294967296.0 происходит деление на ноль и функция автоматически закрывается - прерывается тригер ее вызвавший :(

Подскажите как модифицировать код, чтобы он работал...

nic666 добавил:
Если кто не знает RND(A) должна выдавать число в диапазоне от 0 до A-1 , не больше и не меньше
Старый 14.12.2006, 12:23
p01nTT

offline
Опыт: 11,160
Активность:
замудрил, честно я так и не понял. если 4294967296.0 = 0,то зачем на неё делить??? ведь это и есть вроде прерывание функции. Или ты рассчитываешь на то,что при делении на 0 функция должна выдать случайное число? и как я понял, 134775813 = 0??? или нет?

p01nTT добавил:
кстати на сколько я понял диода, 0 != .0, попробуй разделить на .0, мож получится

p01nTT добавил:
или может быть 4294967296.0 = .0,а надо делить на 0
Старый 14.12.2006, 12:45
DioD

offline
Опыт: 45,134
Активность:
ты на джазе рандом нормальный сделать не сможешь...
я делал 3 таймера запущеные одновременно выбираемые строго по очереди в момент необходимости достать рандом число.
получалось нечто вроде
1.01
9.06
2.05
из таких значений, что повторяются только при первом получении рандом числа
да еще 3 таймера имеют разные периоды и ресетятся в момент рандома
но это работало жутко тупо
Старый 14.12.2006, 13:02
NETRAT

offline
Опыт: 83,712
Активность:
Во-первых у тебя везде overflow - варик не поддерживает числа более 4 байт, да и вообще ты какой-то бред пишешь ...

Простейший ММ датчик (датчик Маклорена-Марсальи aka простейший генератор случайных чисел):
Код:
function RandomMM takes integer a returns integer
set udg_Seed = udg_Seed * X
set udg_Seed = udg_Seed - MAXIMUM * R2I(udg_Seed / MAXIMUM)
return udg_Seed - a * R2I(udg_Seed / a)
endfunction

udg_Seed ВСЕГДА нужно инициализировать. Подойдет любое "некрасивое" число, например 65539
Вместо X - любое другое "некрасивое" число
Вместо MAXIMUM - предельное значение для выбранного типа переменной, в нашем случае это 214748648

И вот еще что - генератора случайных чисел типа real НЕ СУЩЕСТВУЕТ - это всегда эмуляция через генератор int'ов
Старый 14.12.2006, 13:25
nic666

offline
Опыт: 5,612
Активность:
DioD я таки сделал нормальный рандом

Код:
function RND takes integer a returns integer
local integer b
set udg_RandSeed = 1 + (udg_RandSeed * 134775813)

 if (udg_RandSeed < 0) then
   set b = -udg_RandSeed
  else 
   set b = udg_RandSeed
 endif

return ModuloInteger(b,a)
endfunction


Но он по сравнению с Делфовским оригиналом имеет значительно меньший период где-то в 4 раза... но так как я генерирую числа в диапазоне не более 0-1000 то мне хватит в принципе

P.S.
И все же еще вопрос в тему TriggerExecute
Старый 14.12.2006, 13:27
NETRAT

offline
Опыт: 83,712
Активность:
Хотя, это все извращение, в жассе ты нормальный генератор никак не сделаешь
Старый 14.12.2006, 13:27
nic666

offline
Опыт: 5,612
Активность:
NETRAT
спасибо за пример.
подозреваю, что вместо "некрасивое" вы хотели сказать: простое число не превосходящее MAXIMUM

вот скажем 134775813 - не простое все таки.... далее +1 чтобы избежать обнуления генератора, впринципе если начинать не с нуля то можно и без этого

Я не бред написал, а посмотрел ассемблерный листинг ГСЧ реализованого в делфе. Перевел его с ассемблера опять в паскаль , проверил, а затем тоже попытался сделать на жасе...

nic666 добавил:
Непойму о чем вы???

Нормальный рандом - это с "нормальным распределением" или это чисто нормальны для удобный работы?

Пока я хотел сделать рандом с "равномерным распределением", а "нормального распределения" не надо. Укзаный вами датчик Маклорена-Марсальи тоже дает равномерное распределение.
Старый 14.12.2006, 13:41
NETRAT

offline
Опыт: 83,712
Активность:
nic666 простых чисел не так много, хотя, достаточно большое простое число - идеальный вариант. Зачем этот знаковый геморрой, который встроен в датчик? так никто не делает. Генерируются всегда беззнаковые значения и потом сдвигаются если нужен знак. Вообще одиночный ММ нигде не используется - ибо у него период маленький. И уж тем более в таких простых интерпретациях как мы здесь указали.
В большинстве ГСЧ используются два независимых ММ датчика - один заполняет массив случайными значениями, а другой - выбирает из массива случайный элемент. Это значительно уменьшает корелляцию и увеличивает период. Такой датчик на Jass'е - это слишком накладно.

NETRAT добавил:
Ха, ха, ха, ты хочешь сказать что у этих датчиков нормальное распределение? Как бы ни так! Экспоненциальное. Частота средних значений гораздо выше чем краевых. В Двойном это менее обусловленно, однако, тоже просматривается

NETRAT добавил:
Я все еще не догоняю чем тебя не устраивает стандартный. Со всеми его недостатками, он будет работать быстрее чем самописный InJass генератор
Старый 14.12.2006, 13:52
nic666

offline
Опыт: 5,612
Активность:
Знаковый геморой пришлось добавить мне, в оригинале используется беззнаковый mul
но в жасе ведь нет беззнаковых целых, вот потому я и добавил это...

nic666 добавил:
ЗАЧЕМ...
я пробовал стандартный, у меня делается в одном тригере setRandomSeed а в нескольких других вызов генератора.

Оказывается что при одинаковом стартовом числе часто последовательности разные...происходит сбой где-то... движок где-то использует ГСЧ для своих целей или в AI где-то... а мне надо повторять последовательность. Может конечно где-то у меня тригеры в разных потоках работают, это я еще проверяю...
Старый 14.12.2006, 13:58
NETRAT

offline
Опыт: 83,712
Активность:
Цитата:
а мне надо повторять последовательность
тебе же это только для теста нужно - создай массив, забей его случайной последовательностью и используй его вместо рандома - это куда проще и удобней чем свой датчик
Старый 14.12.2006, 15:11
nic666

offline
Опыт: 5,612
Активность:
1) Много чисел генерируется.
2) И я пытаюсь реализовать идею, когда расположение на карте объектов (деревья крипы и т.п. )зависит от ключа... вводишь в чате -key xxxx и получаешь заведомо одинаковую карту при одинаковом ключе.

nic666 добавил:
Ура! Заработало...со своим генератором.

Где именно движек меняет RandSeed я так и не выяснил, похоже где-то в CreateDestructable.
Просто отличий бывыло иногда мало, а иногда много, но я генерирую более 5000 объектов и это явно было заметно
Старый 14.12.2006, 15:39
p01nTT

offline
Опыт: 11,160
Активность:
nic666 то есть ты хочешь несколько видов ландшафтов в карте,причём ты сам выбираешь какой,прикольная идея,я тоже думал о такой,но потом забил на то для чего она мне нужна было,по причине не знания джазза,скоро вернусь к ней,ведь джазз у же изучил относительно и думаю смогу реализовать
Старый 17.12.2006, 16:06
DioD

offline
Опыт: 45,134
Активность:
создание карты динамически крайне сложный процесс, обладатели слабых компов получат диск при слобом компе
Старый 17.12.2006, 19:27
NECros88

offline
Опыт: 16,351
Активность:
По-моему нужно основываться на си, так как вар написан именно на нём.

NECros 88 добавил:
Хотя ты его через ассемблер пропускал... хз) Вообще впринципе как я знаю по функциям, нормальной генератор нельзя сделать на жассе
Старый 18.12.2006, 01:35
nic666

offline
Опыт: 5,612
Активность:
Впринципе я получил генератор даже лучше стандартного... и для меня было не в этом дело, а в том, чтобы последовательность повторялась, то есть чтобы никакие тригеры или движек не использовал мой генератор.
Скоро опубликую бета-карту.
Старый 18.12.2006, 10:24
nic666

offline
Опыт: 5,612
Активность:
Забросил в архив (12)Infinity Melee 0.5b полностью работающая карта. Но пока маркирую как бета.

Обсуждение тут:
http://xgm.guru/forum/showthread.php?t=8407

Отредактировано nic666, 18.12.2006 в 15:56.
Старый 18.12.2006, 13:45
Toadcop

offline
Опыт: 54,313
Активность:
в крайнем случаи можно свою натив функцию рандом написать... но это для сингла + это бред. нормальный рандом.
Старый 19.12.2006, 15:27
Iron
Листовой
offline
Опыт: 24,427
Активность:
NETRAT, какой же это нафег рандом? Ведь если передовать в ту функцию 1-о и то же число, то и возвращаемое число будет всегда одно и то же.

Или вы не о том рандоме говорите?
Старый 19.12.2006, 17:08
NETRAT

offline
Опыт: 83,712
Активность:
Все итерационные рандомайзеры имеют seed, от которого зависит значение на каждой итерации. Так вот если seed одинаковый, то и значения будут одинаковые. Этого не избежать. В компе в качестве seed обычно берется количество миллисекунд, прошедших с момента запуска компа / от какого-то другого момента.
Принцип в том что результат зависит не от параметров функции, а от количества раз, которое эта функция вызывалась. Это и есть генератор псевдослучайных чисел ака рандомайзер.
Старый 19.12.2006, 19:10
Iron
Листовой
offline
Опыт: 24,427
Активность:
Пнятно.
Старый 19.12.2006, 19:48
Ответ

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

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

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

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



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