nic666
offline
Опыт:
5,612Активность: |
Как создать свой RND генератор?
Чем не устраивает обычный Random?
- Тем что он используется движком или AI в своих целях... Я проверил свой код, сделал так что тригеры включаются последовательно, накладок быть не может. Но где-то между вызовом моих тригеров выполняются другие, наверное связаные с работой AI и они наверное используют Random в своих целях, мне этого не надо.... Всвязи с чем создаю эту тему. Если это удастся то можно иметь свой изолированый генератор и никакие AI в него не влезут... Я опробовал следующий код, в DELPHI он полностью повторяет ГСЧ, тот самый что в нее встроен, но код не сработал в Jasse... Код:
Как я понял после некоторых попыток модификаций в жасе тип 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 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
p01nTT
offline
Опыт:
11,160Активность: |
замудрил, честно я так и не понял. если 4294967296.0 = 0,то зачем на неё делить??? ведь это и есть вроде прерывание функции. Или ты рассчитываешь на то,что при делении на 0 функция должна выдать случайное число? и как я понял, 134775813 = 0??? или нет?
p01nTT добавил: кстати на сколько я понял диода, 0 != .0, попробуй разделить на .0, мож получится p01nTT добавил: или может быть 4294967296.0 = .0,а надо делить на 0 |
14.12.2006, 12:45 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
ты на джазе рандом нормальный сделать не сможешь...
я делал 3 таймера запущеные одновременно выбираемые строго по очереди в момент необходимости достать рандом число.
получалось нечто вроде
1.01
9.06 2.05 из таких значений, что повторяются только при первом получении рандом числа
да еще 3 таймера имеют разные периоды и ресетятся в момент рандома
но это работало жутко тупо |
14.12.2006, 13:02 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
Во-первых у тебя везде overflow - варик не поддерживает числа более 4 байт, да и вообще ты какой-то бред пишешь ...
Простейший ММ датчик (датчик Маклорена-Марсальи aka простейший генератор случайных чисел): Код:
udg_Seed ВСЕГДА нужно инициализировать. Подойдет любое "некрасивое" число, например 65539 Вместо X - любое другое "некрасивое" число Вместо MAXIMUM - предельное значение для выбранного типа переменной, в нашем случае это 214748648 И вот еще что - генератора случайных чисел типа real НЕ СУЩЕСТВУЕТ - это всегда эмуляция через генератор int'ов |
14.12.2006, 13:25 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
DioD я таки сделал нормальный рандом
Код:
Но он по сравнению с Делфовским оригиналом имеет значительно меньший период где-то в 4 раза... но так как я генерирую числа в диапазоне не более 0-1000 то мне хватит в принципе P.S. И все же еще вопрос в тему TriggerExecute |
14.12.2006, 13:27 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
Хотя, это все извращение, в жассе ты нормальный генератор никак не сделаешь |
14.12.2006, 13:27 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
NETRAT
спасибо за пример. подозреваю, что вместо "некрасивое" вы хотели сказать: простое число не превосходящее MAXIMUM вот скажем 134775813 - не простое все таки.... далее +1 чтобы избежать обнуления генератора, впринципе если начинать не с нуля то можно и без этого Я не бред написал, а посмотрел ассемблерный листинг ГСЧ реализованого в делфе. Перевел его с ассемблера опять в паскаль , проверил, а затем тоже попытался сделать на жасе... nic666 добавил: Непойму о чем вы??? Нормальный рандом - это с "нормальным распределением" или это чисто нормальны для удобный работы? Пока я хотел сделать рандом с "равномерным распределением", а "нормального распределения" не надо. Укзаный вами датчик Маклорена-Марсальи тоже дает равномерное распределение. |
14.12.2006, 13:41 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
nic666 простых чисел не так много, хотя, достаточно большое простое число - идеальный вариант. Зачем этот знаковый геморрой, который встроен в датчик? так никто не делает. Генерируются всегда беззнаковые значения и потом сдвигаются если нужен знак. Вообще одиночный ММ нигде не используется - ибо у него период маленький. И уж тем более в таких простых интерпретациях как мы здесь указали.
В большинстве ГСЧ используются два независимых ММ датчика - один заполняет массив случайными значениями, а другой - выбирает из массива случайный элемент. Это значительно уменьшает корелляцию и увеличивает период. Такой датчик на Jass'е - это слишком накладно. NETRAT добавил: Ха, ха, ха, ты хочешь сказать что у этих датчиков нормальное распределение? Как бы ни так! Экспоненциальное. Частота средних значений гораздо выше чем краевых. В Двойном это менее обусловленно, однако, тоже просматривается NETRAT добавил: Я все еще не догоняю чем тебя не устраивает стандартный. Со всеми его недостатками, он будет работать быстрее чем самописный InJass генератор |
14.12.2006, 13:52 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Знаковый геморой пришлось добавить мне, в оригинале используется беззнаковый mul
но в жасе ведь нет беззнаковых целых, вот потому я и добавил это... nic666 добавил: ЗАЧЕМ... я пробовал стандартный, у меня делается в одном тригере setRandomSeed а в нескольких других вызов генератора. Оказывается что при одинаковом стартовом числе часто последовательности разные...происходит сбой где-то... движок где-то использует ГСЧ для своих целей или в AI где-то... а мне надо повторять последовательность. Может конечно где-то у меня тригеры в разных потоках работают, это я еще проверяю... |
14.12.2006, 13:58 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
Цитата:
|
|
14.12.2006, 15:11 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
1) Много чисел генерируется.
2) И я пытаюсь реализовать идею, когда расположение на карте объектов (деревья крипы и т.п. )зависит от ключа... вводишь в чате -key xxxx и получаешь заведомо одинаковую карту при одинаковом ключе. nic666 добавил: Ура! Заработало...со своим генератором. Где именно движек меняет RandSeed я так и не выяснил, похоже где-то в CreateDestructable. Просто отличий бывыло иногда мало, а иногда много, но я генерирую более 5000 объектов и это явно было заметно |
14.12.2006, 15:39 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
p01nTT
offline
Опыт:
11,160Активность: |
nic666 то есть ты хочешь несколько видов ландшафтов в карте,причём ты сам выбираешь какой,прикольная идея,я тоже думал о такой,но потом забил на то для чего она мне нужна было,по причине не знания джазза,скоро вернусь к ней,ведь джазз у же изучил относительно и думаю смогу реализовать
|
17.12.2006, 16:06 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
создание карты динамически крайне сложный процесс, обладатели слабых компов получат диск при слобом компе |
17.12.2006, 19:27 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NECros88
offline
Опыт:
16,351Активность: |
По-моему нужно основываться на си, так как вар написан именно на нём.
NECros 88 добавил: Хотя ты его через ассемблер пропускал... хз) Вообще впринципе как я знаю по функциям, нормальной генератор нельзя сделать на жассе |
18.12.2006, 01:35 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Впринципе я получил генератор даже лучше стандартного... и для меня было не в этом дело, а в том, чтобы последовательность повторялась, то есть чтобы никакие тригеры или движек не использовал мой генератор.
Скоро опубликую бета-карту. |
18.12.2006, 10:24 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
в крайнем случаи можно свою натив функцию рандом написать... но это для сингла + это бред. нормальный рандом. |
19.12.2006, 15:27 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Iron
Листовой
offline
Опыт:
24,427Активность: |
NETRAT, какой же это нафег рандом? Ведь если передовать в ту функцию 1-о и то же число, то и возвращаемое число будет всегда одно и то же.
Или вы не о том рандоме говорите? |
19.12.2006, 17:08 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
Все итерационные рандомайзеры имеют seed, от которого зависит значение на каждой итерации. Так вот если seed одинаковый, то и значения будут одинаковые. Этого не избежать. В компе в качестве seed обычно берется количество миллисекунд, прошедших с момента запуска компа / от какого-то другого момента. Принцип в том что результат зависит не от параметров функции, а от количества раз, которое эта функция вызывалась. Это и есть генератор псевдослучайных чисел ака рандомайзер. |
19.12.2006, 19:10 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Iron
Листовой
offline
Опыт:
24,427Активность: |
Пнятно. |
19.12.2006, 19:48 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|