nic666
offline
Опыт:
5,612Активность: |
Randomize
Собственно в некоторых языках есть такая процедура randomize, которая устанавливает величину randseed в зависимости от текущего времени суток. Соответственно при каждом запуске программы, при использовании randomize, генератор случайных чисел выдает разную последовательность....
Именно этого я хочу на своей карте, чтобы некотоые элементы были разными при каждом запуске. Нужен аналог randomize. Знаю что есть в jass такая штука SetRandomSeed(N), можно установить ГСЧ на N, но где взять это случайное N? То есть: где взять время суток? Или может в jass есть аналог randomize? подскажите пожалуйста... Не стоит писать всё название большими буквами. Отредактировано DioD, 01.09.2006 в 11:19. |
01.09.2006, 09:28 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DotA_DR
offline
Опыт:
103Активность: |
Randomize
А разве при каждом запуске эта последовательность не разная? |
01.09.2006, 09:32 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
так вар автоматом походу задает random seed |
01.09.2006, 10:06 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
Вар задаёт рандом сид каждый раз так что в этом нет никакой необходимости. |
01.09.2006, 11:12 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Необходимость есть!!!
Как только вы включаете режим Cinematic то тут же выполняется код функции CinematicModeBJ В котором прописана строчка SetRandomSeed(0) таким образом, кинематика сбрасывает randseed nic666 добавил: Как узнать время суток из вара? |
01.09.2006, 11:48 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DotA_DR
offline
Опыт:
103Активность: |
а когда выходишь из режима Cinematic он востанавливается
Код:
|
01.09.2006, 11:49 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
DotA_DR Ну да, пожалуй ты прав.
А все таки принудительно нельзя никак сделать типа randomize? nic666 добавил: Просто я хочу сделать в карте чтобы задавался ключ командой -mapkey NNN или командой -randomize задавался случайный ключ. |
01.09.2006, 11:58 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
может можно как то вытащить время игровых суток вара, хз |
01.09.2006, 12:49 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
function GetTimeOfDay takes nothing returns real
return GetFloatGameState(GAME_STATE_TIME_OF_DAY) endfunction Для этого вообще требуется стэк таймеров, объясняю как он работает.
loop
exitwhen I = 10 call TimerStart(timer[I],999999,false,null) call TriggerSleepAction(Random(1-100)) set I = I+1 endloop ВСЕ ТАЙМЕРЫ БУДУТ ПОКАЗЫВАТЬ РАЗНЫЕ ЧИСЛА
Потом мы вытаскивем один таймер берём прошедшее время и устанавливаем сид, ОН никогда не повториться так как таймеры идут вверх.
Можно сделать таймеры периодическими.
запускаем пачку таймеров на случайные периоды 1-10 а в действие добовляем сид ресет. |
01.09.2006, 13:03 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Что то мудренное...
1) я имел ввиду не игровое "время суток", а реальное системное время суток... в игровых сутках нет никакого толку ... 2) стек таймеров... ? Мне хватило бы и одного таймера и по сравнению с этим, - стек таймеров - просто бесполезное расточительство. Результат ведь одинаковый, проблема в том, что таймер будет всегда стартовать при загрузке карты с одинакового числа, и значит разброса значений не будет... Даже если это число генерится с помощью Random - это ничем не лучше,...чем просто Random Можно вообще засекать время пока юзер обдумывает ответ в диалоге-менюшке, ну например при выборе сложности... но время реакции юзера - стремиться к минимуму, и это тоже не подходит... Единственным решением было бы "внешнее число", именно реальная дата и время суток... но к сожалению не знаю как ее получить... nic666 добавил: Может быть, действительно решение: сохранять randseed при старте карты и отсчитывать прочие от этого сохраненного. |
01.09.2006, 13:20 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
Таймеры в стеке стартуют не с начала мэп инита, и числа всегда разные. |
01.09.2006, 13:42 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Цитата:
но то что написано здесь не "разные" Цитата:
чтобы устанавливать random не надо использовать сам random, иначе получиться тавтология, то же самое... и никакое количество таймеров это не исправит. Идея со стеком таймеров скрывает проблему от самого разработчика карты, но нисколько не решает проблему. Просто запутывает человека... |
||
01.09.2006, 13:52 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
Ты не понмаешь, система таймеров запускается до изменения рандом сида и сохраняет его внутри.
Таким образом числа будут случайными даже если рандом сид изменён. Просто надо делать таймер стэк, тоесть один таймер запускает другой другой третий и при завершении одного он ресктит еще какойто что ресетит еще один, это очень сложно объяснить, да и сделать сложно.
НО ЭТО РАБОТАЕТ. |
01.09.2006, 14:15 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
может и работает но это все лишнее... одного таймера достаточно |
01.09.2006, 15:42 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
Ну делай через один раз хочешь. |
01.09.2006, 15:53 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Короче последнее к чему я пришел, выглядит примерно так:
Учитывая то что вар сам инициализирует randseed, получается одного таймера достаточно....
А стек таймеров, по моему мнению, это от лукавого, просто кажется более случайным, и по моему мнению, именно только кажется... P.S. Если повезет то скоро мапу доделаю, эдак к 1 октябрю :) |
01.09.2006, 19:26 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
Стэк таймеров позволяет использовать его в качестве рандома не применяя каких либо рандомом из нативок вара, но это очень сложно настраивать. |
01.09.2006, 20:17 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
ну если говорить о формулах случайного генератора, то можно предложить несколько, например
Xi+1=Sin(Xi+Pi)^5 Xi+1=((Xi+M) mod N)/N, где M и N простые числа желательно 1<N/M<2 и т.п. замен для штатного ГСЧ можно изобрести предостаточно... и для этого таймеров не нужно вообще... Я все таки о том "с чего начать", т.е. о стартовом числе для ГСЧ... |
01.09.2006, 21:30 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|