![]()
nic666
![]() ![]() offline
Опыт:
5,612Активность: |
Randomize
Собственно в некоторых языках есть такая процедура randomize, которая устанавливает величину randseed в зависимости от текущего времени суток. Соответственно при каждом запуске программы, при использовании randomize, генератор случайных чисел выдает разную последовательность....
Именно этого я хочу на своей карте, чтобы некотоые элементы были разными при каждом запуске. Нужен аналог randomize. Знаю что есть в jass такая штука SetRandomSeed(N), можно установить ГСЧ на N, но где взять это случайное N? То есть: где взять время суток? Или может в jass есть аналог randomize? подскажите пожалуйста... Не стоит писать всё название большими буквами. Отредактировано DioD, 01.09.2006 в 11:19. |
![]() |
#1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DotA_DR
![]() offline
Опыт:
103Активность: |
Randomize
А разве при каждом запуске эта последовательность не разная? |
![]() |
#2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Mefist
Is it cocktail hour yet?
![]() ![]() offline
Опыт:
98,190Активность: |
так вар автоматом походу задает random seed |
![]() |
#3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
Вар задаёт рандом сид каждый раз так что в этом нет никакой необходимости. |
![]() |
#4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
nic666
![]() ![]() offline
Опыт:
5,612Активность: |
Необходимость есть!!!
Как только вы включаете режим Cinematic то тут же выполняется код функции CinematicModeBJ В котором прописана строчка SetRandomSeed(0) таким образом, кинематика сбрасывает randseed nic666 добавил: Как узнать время суток из вара? |
![]() |
#5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DotA_DR
![]() offline
Опыт:
103Активность: |
а когда выходишь из режима Cinematic он востанавливается
Код:
|
![]() |
#6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
nic666
![]() ![]() offline
Опыт:
5,612Активность: |
DotA_DR Ну да, пожалуй ты прав.
А все таки принудительно нельзя никак сделать типа randomize? nic666 добавил: Просто я хочу сделать в карте чтобы задавался ключ командой -mapkey NNN или командой -randomize задавался случайный ключ. |
![]() |
#7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Mefist
Is it cocktail hour yet?
![]() ![]() offline
Опыт:
98,190Активность: |
может можно как то вытащить время игровых суток вара, хз |
![]() |
#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 а в действие добовляем сид ресет. |
![]() |
#9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
nic666
![]() ![]() offline
Опыт:
5,612Активность: |
Что то мудренное...
1) я имел ввиду не игровое "время суток", а реальное системное время суток... в игровых сутках нет никакого толку ... 2) стек таймеров... ? Мне хватило бы и одного таймера и по сравнению с этим, - стек таймеров - просто бесполезное расточительство. Результат ведь одинаковый, проблема в том, что таймер будет всегда стартовать при загрузке карты с одинакового числа, и значит разброса значений не будет... Даже если это число генерится с помощью Random - это ничем не лучше,...чем просто Random Можно вообще засекать время пока юзер обдумывает ответ в диалоге-менюшке, ну например при выборе сложности... но время реакции юзера - стремиться к минимуму, и это тоже не подходит... Единственным решением было бы "внешнее число", именно реальная дата и время суток... но к сожалению не знаю как ее получить... nic666 добавил: Может быть, действительно решение: сохранять randseed при старте карты и отсчитывать прочие от этого сохраненного. |
![]() |
#10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
Таймеры в стеке стартуют не с начала мэп инита, и числа всегда разные. |
![]() |
#11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
nic666
![]() ![]() offline
Опыт:
5,612Активность: |
Цитата:
но то что написано здесь не "разные" Цитата:
чтобы устанавливать random не надо использовать сам random, иначе получиться тавтология, то же самое... и никакое количество таймеров это не исправит. Идея со стеком таймеров скрывает проблему от самого разработчика карты, но нисколько не решает проблему. Просто запутывает человека... |
||
![]() |
#12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
Ты не понмаешь, система таймеров запускается до изменения рандом сида и сохраняет его внутри.
Таким образом числа будут случайными даже если рандом сид изменён. Просто надо делать таймер стэк, тоесть один таймер запускает другой другой третий и при завершении одного он ресктит еще какойто что ресетит еще один, это очень сложно объяснить, да и сделать сложно.
НО ЭТО РАБОТАЕТ. |
![]() |
#13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
nic666
![]() ![]() offline
Опыт:
5,612Активность: |
может и работает но это все лишнее... одного таймера достаточно |
![]() |
#14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
Ну делай через один раз хочешь. |
![]() |
#15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
nic666
![]() ![]() offline
Опыт:
5,612Активность: |
Короче последнее к чему я пришел, выглядит примерно так:
Учитывая то что вар сам инициализирует randseed, получается одного таймера достаточно....
А стек таймеров, по моему мнению, это от лукавого, просто кажется более случайным, и по моему мнению, именно только кажется... P.S. Если повезет то скоро мапу доделаю, эдак к 1 октябрю :) |
![]() |
#16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
Стэк таймеров позволяет использовать его в качестве рандома не применяя каких либо рандомом из нативок вара, но это очень сложно настраивать. |
![]() |
#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 и т.п. замен для штатного ГСЧ можно изобрести предостаточно... и для этого таймеров не нужно вообще... Я все таки о том "с чего начать", т.е. о стартовом числе для ГСЧ... |
![]() |
#18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|