Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
27 Aug 2012, 11:24
Сообщение
#41
|
|
![]() В миру GrayFace Сообщений: 2 529 Спасибо сказали: 817 раз |
Учитывая что размер исходников будет в районе 100k строк (это размер кода vcmi) выискивать то не знаю что в этом море текста просто нереально. Ну да, найти то не знаю что еще никому нигде не получалось. А такие конкретные вещи - без проблем. -------------------- ДНК банана на 50% состоит из человека.
|
|
|
|
27 Aug 2012, 12:18
(Сообщение отредактировал IvanSav - 27 Aug 2012, 12:50)
Сообщение
#42
|
|
|
VCMI developer Сообщений: 377 Спасибо сказали: 690 раз |
Цитата Код позволил бы понять, что всё, относящееся к объектам, в Героях в первую очередь привязано к клеткам, это фундаментальная штука, а не маленькая фишка. :-) Ну я подозревал это с тех пор как узнал об этой баге. Самая интересная часть это додуматься связать эту фишку с фонтаном - заметить что у фонтана есть две клетки, вспомнить про эту фишку, сделать выводы. Цитата Это легко проверяется без кода. Согласен. Это я привел просто для примера. Но шанс что кто-то начнет высматривать как устроены родные земли (это же очевидно!) довольно мал. Цитата А вот, скажем, смертельный взгляд могучих горгон у вас как работает? Сам код вот: http://sourceforge.net/apps/trac/vcmi/brow...?rev=2848#L5258 В этой части кода я не очень разбираюсь, так что могу и ошибиться. mean = кол-во горгон / 10 если mean вышел больше 1 - берем случайное значение с распределением Пуассона - http://ru.wikipedia.org/wiki/Распределение_Пуассона затем с вероятностью 10% добавляем еще одно существо. EDIT: вероятность = 10 * кол-во горгон. Если горгон 10+ - гарантировано убъет одно существо. Работает только с живыми - на это проверка отдельно стоит. Кстати - там бага. mean всегда будет целым - нужно было к double привести -------------------- Слава Україні!
|
|
|
|
27 Aug 2012, 12:22
(Сообщение отредактировал Vizit0r - 27 Aug 2012, 12:22)
Сообщение
#43
|
|
![]() Immortal Сообщений: 1 437 Спасибо сказали: 2149 раз |
вот так и ошибки находятся)
|
|
|
|
27 Aug 2012, 12:32
(Сообщение отредактировал Erolast - 27 Aug 2012, 12:32)
Сообщение
#44
|
|
![]() Зануда Сообщений: 2 238 Спасибо сказали: 2899 раз |
Зато, имея исходники, можно было бы сделать нормальную поддержку для Win 7 и нормальный запуск не_в_аккаунте_администратора
|
|
|
|
27 Aug 2012, 12:55
(Сообщение отредактировал Sav - 27 Aug 2012, 12:58)
Сообщение
#45
|
|
|
Immortal Сообщений: 9 448 Спасибо сказали: 4000 раз |
Вот как действует смертельный взгляд в игре:
За каждое существо в атакующем стеке берётся случайное число от 1 до 100 и считается, сколько всего выпало чисел, меньших или равных 10 (т. е. у каждого существа в стеке 10% шанс убить). Потом получившееся число сравнивается с (1 + [количество атакующих]/5 (с округлением вверх)) и если первое больше, оно приравнивается ко второму. Т. е. горгоны никогда не убивают больше (1 + [количество атакующих]/5 (с округлением вверх)) существ взглядом. Ну и потом количество урезается до количества существ в атакуемом стеке, если надо. При этом эффект срабатывает в обход функций наложения заклинания, поэтому единственное условие срабатывания - флаг "живое существо" у атакованного (ну и выпавший хотя бы у одного существа шанс убить). Предполагаю, что первый пункт воспроизводится распределением Пуассона (хотя я недостаточно знаком с этими вещами, чтобы, бегло просмотрев статью, сказать наверняка). А вот второй пункт - никак. Цитата(Erolast) Зато, имея исходники, можно было бы сделать нормальную поддержку для Win 7 и нормальный запуск не_в_аккаунте_администратора Насколько я понимаю, проблема тут исключительно в использовании реестра. А это исправлено в Эре, исходники которой в свободном доступе. |
|
|
|
27 Aug 2012, 13:04
Сообщение
#46
|
|
|
VCMI developer Сообщений: 377 Спасибо сказали: 690 раз |
Erolast,
Помню как разработчики с gog.com жаловались что сегодня запустить то, что было сделано под 95ю/98ю винду сложнее чем то, что было сделано под дос. И это имея исходники - там ужасный код, который нереально портировать. С тройкой подозреваю все не настолько плохо но не удивлюсь если через несколько лет это изменится. А VCMI под линухой вполне себе умеет запускаться без админа и с правами только чтение на папку игры. Sav, Благодарю, ограничение проверю, все остальное уже и так как надо. -------------------- Слава Україні!
|
|
|
|
11 Sep 2012, 10:36
Сообщение
#47
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Цитата Потом получившееся число сравнивается с (1 + [количество атакующих]/5 (с округлением вверх)) и если первое больше, оно приравнивается ко второму. Т. е. горгоны никогда не убивают больше (1 + [количество атакующих]/5 (с округлением вверх)) существ взглядом. Как называется функция округления вверх? Получается, 1 гр. горгона может убить 2 лазурика? |
|
|
|
11 Sep 2012, 11:07
Сообщение
#48
|
|
![]() 😸🧡✊✌️ Сообщений: 16 479 Спасибо сказали: 3376 раз |
> Как называется функция округления вверх?
Обычно ceil(). -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
11 Sep 2012, 11:52
Сообщение
#49
|
|
|
Immortal Сообщений: 9 448 Спасибо сказали: 4000 раз |
Функции округления вверх не используется, просто (X + 9)/5.
Одна горгона двух не убьёт из-за механизма подсчёта. (X + 9)/5 - это просто максимум, срезающий слишком большие значения, в случае 1 горгоны он просто никогда не сработает. |
|
|
|
11 Sep 2012, 12:19
(Сообщение отредактировал AlexSpl - 11 Sep 2012, 12:26)
Сообщение
#50
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Пока не встречал округления вверх в Героях, поэтому и спросил. Ещё недавно закончился турнир, в котором часть прохождения была завязана на абилке гр. горгон. Теперь некоторые игроки утверждают, что вероятность срабатывания абилки много меньше 10%. Решил вот поинтересоваться
Обычно в Героях значение, полученное в результате операций с дробными числами и отражающее перечислимые объекты, ограничивают снизу 1 (единицей), предварительно округлив вниз результат дробной операции. Вот и возникло у меня такое соображение: может, кол-во погибающих юнитов равно max(1, [N/5]), где N - количество атакующих горгон? Ещё неясен момент с вероятностью: Цитата За каждое существо в атакующем стеке берётся случайное число от 1 до 100 и считается, сколько всего выпало чисел, меньших или равных 10 (т. е. у каждого существа в стеке 10% шанс убить). Потом получившееся число сравнивается с (1 + [количество атакующих]/5 (с округлением вверх)) и если первое больше, оно приравнивается ко второму. Какова вероятность того, что абилка сработает для 1, 10, 100, 1000 горгон? Цитата Ну и потом количество урезается до количества существ в атакуемом стеке, если надо. Если ещё и этот момент учесть, то будет так: min(Nd, max(1, [Na/5])), где Na - количество атакующих гр. горгон, Nd - кол-во атакуемых гр. горгонами существ. |
|
|
|
11 Sep 2012, 13:15
Сообщение
#51
|
|
|
Immortal Сообщений: 9 448 Спасибо сказали: 4000 раз |
Цитата(AlexSpl) Обычно в Героях значение, полученное в результате операций с дробными числами и отражающее перечислимые объекты, ограничивают снизу 1 (единицей), предварительно округлив вниз результат дробной операции. Вот и возникло у меня такое соображение: может, кол-во погибающих юнитов равно max(1, [N/5]), где N - количество атакующих горгон? Там нет никаких дробей, у горгон всё считается в целых числах. Грубо говоря: Код int x = 0; for (int i = 0; i < gorgons_count; i++) { if (1 + rand()%100 <= 10) x++; } x = min(x, (x + 9)/5); x = min(x, enemy_count); int killed_count = x; Цитата(AlexSpl) Какова вероятность того, что абилка сработает для 1, 10, 100, 1000 горгон? Я описал точный алгоритм, используемый игрой. Вероятности уже надо считать, сама игра этого не делает. |
|
|
|
11 Sep 2012, 13:24
(Сообщение отредактировал AlexSpl - 11 Sep 2012, 13:27)
Сообщение
#52
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Интересный фрагмент, сочетающий в себе и вероятность срабатывания абилки и кол-во убиваемых существ, т.е. вероятность того, что абилка не сработает равна P[killed_count == 0].
Выражение rand()%100 может принимать значения от 0 до 99. Надо будет прикинуть теперь вероятности. |
|
|
|
11 Sep 2012, 13:30
Сообщение
#53
|
|
|
VCMI developer Сообщений: 97 Спасибо сказали: 78 раз |
Ещё неясен момент с вероятностью: Цитата За каждое существо в атакующем стеке берётся случайное число от 1 до 100 и считается, сколько всего выпало чисел, меньших или равных 10 (т. е. у каждого существа в стеке 10% шанс убить). Потом получившееся число сравнивается с (1 + [количество атакующих]/5 (с округлением вверх)) и если первое больше, оно приравнивается ко второму. Какова вероятность того, что абилка сработает для 1, 10, 100, 1000 горгон? Вроде так: 1) для 1 10% 2) для 10 65% 3) для 100 99,99% 4) для 1000 еще ближе к 100% |
|
|
|
11 Sep 2012, 16:04
(Сообщение отредактировал AlexSpl - 12 Sep 2012, 13:20)
Сообщение
#54
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Цитата Вроде так: 1) для 1 10% 2) для 10 65% 3) для 100 99,99% 4) для 1000 еще ближе к 100% Так оно и есть, но это частный случай. Вероятность того, что для N горгон сумма Цитата int x = 0; for (int i = 0; i < gorgons_count; i++) { if (1 + rand()%100 <= 10) x++; } окажется равной S равна P[N, S] = C(N, S) * p^S * (1 - p)^(N - S), где C(N, S) = N! / (S! * (N - S)!) - число сочетаний из N по S, p = 0,1 (10%). Подставляя p = 0,1 в формулу, получим P[N, S] = C(N, S) * 0,1^S * 0,9^(N - S) Найдём теперь вероятность того, что N горгон убьют K существ только за счёт их абилки. Цитата x = min(x, (x + 9)/5); Поэтому вероятность того, что N горгон убьют K существ только за счёт своей абилки равна: Код -- SUM{i} P[N, i], при K <= X; -- 0, при K > X, где X = min(Nd, [(N + 9) / 5]), Nd - кол-во существ в атакуемом отряде, а суммирование осуществляется по всем i таким, что min(i, [(i + 9)/5]) = K. min(i, [(i + 9) / 5]) = Код -- i = K при K < 2; -- [(i + 9) / 5] = K при K > 2. !!! Случай K = 2 следует рассмотреть отдельно, т.к. min(1, [(1 + 9)/5]) = 1, а не 2. Упростим второе условие: Код K <= (i + 9) / 5 < K + 1 5K <= i + 9 < 5K + 5 5K - 9 <= i < 5K - 4 Т.к. i - целое число, то последнее неравенство можно заменить на эквивалентное: 5K - 9 <= i <= 5K - 5 Окончательно получим, что искомая вероятность P[N, killed_count == K] равна Код -- C(N, K) * 0,1^K * 0,9^(N - K), при K < 2; -- SUM{2 <= i <= 5} P[N, i], при K = 2; -- SUM{5K - 9 <= i <= 5K - 5} P[N, i], при 2 < K <= min(Nd, [(N + 9)/5]); -- 0, при K > min(Nd, [(N + 9)/5]). Например, вероятность того, что для 10 горгон абилка не сработает равна P[10, killed_count == 0] = C(10, 0) * 0,1^0 * 0.9^10 = 34,9%. |
|
|
|
11 Sep 2012, 17:30
(Сообщение отредактировал AVS - 11 Sep 2012, 17:35)
Сообщение
#55
|
|
|
VCMI developer Сообщений: 97 Спасибо сказали: 78 раз |
Интереснее матожидание количества убитых юнитов.
В VCMI именно от него и считают (1/10 от количества коров). В оригинале также получается? |
|
|
|
11 Sep 2012, 17:44
(Сообщение отредактировал AlexSpl - 12 Sep 2012, 13:23)
Сообщение
#56
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Цитата В VCMI именно от него и считают (1/10 от количества коров). В оригинале также получается? Если это так, то это далеко не очевидно. Нужно проверять. Поправил условия. Выделил частный случай K = 2. |
|
|
|
12 Sep 2012, 13:47
Сообщение
#57
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Цитата Интереснее матожидание количества убитых юнитов. M[10] = 1 * P[10, killed_count = 1] + 2 * P[10, killed_count = 2] + 3 * P[10, killed_count = 3], т.к. остальные слагаемые равны 0 (10 горгон убивают 3 юнита максимум). P(10, killed_count = 0) = = 0,9^10 = 0,3486784401; P[10, killed_count = 1] = = 10 * 0,1 * 0,9^9 = 0,387420489; P[10, killed_count = 2] = = P[10, 2] + P[10, 3] + P[10, 4] + P[10, 5] = 0,1937102445 + 0,057395628 + 0,011160261 + 0,0014880348 = 0,2637541683; P[10, killed_count = 3] = = P[10, 6] + P[10, 7] + P[10, 8] + P[10, 9] + P[10, 10] = 1 - (P[0] + P[1] + P[2]) = 0,0001469026. Тогда M[10] = 0,387420489 + 2 * 0,2637541683 + 3 * 0,0001469026 = 0,9153695334. Программа даёт: Код M[1] = 0.100000 M[2] = 0.200000 M[3] = 0.299000 M[5] = 0.490970 M[10] = 0.915370 M[15] = 1.247316 M[20] = 1.497930 M[50] = 2.354309 M[100] = 3.399622 |
|
|
|
13 Sep 2012, 09:16
(Сообщение отредактировал AlexSpl - 13 Sep 2012, 09:45)
Сообщение
#58
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Начал проверять теорию на практике и обнаружил, что 100 Могучих Горгон убивают далеко не 3 существа в среднем, как обещает теория. На самом деле абилка Могучих Горгон работает не так, как описал Sav. Действительно, у каждого существа в отряде есть 10% шанс убить одно существо в атакуемом отряде, однако они не могут убить больше чем ceil(N/10) существ своей абилкой, где N - количество Могучих Горгон, ceil() - округление вверх (функция не вызывается явно). Т.е. 1 горгона убивает максимум ceil(1/10) = 1 существо, 10 горгон - ceil(10/10) = тоже 1 существо, 11 горгон - ceil(11/10) = уже 2 существа и т.д. Иными словами, всё намного проще...
Тогда вероятность P[N, K] того, что N горгон убьют K существ только за счёт своей абилки равна Код -- C[N, K] * 0,1^K * 0,9^(N - K), при K < ceil(N/10); -- 1 - SUM{0 <= i < ceil(N/10)} P[N, i], при K = ceil(N/10); -- 0, при K > ceil(N/10). Математическое ожидание (M[N]) количества погибающих существ при атаке N горгонами (Mathcad): Код N | M[N] --------------- 1 | 0.100000 2 | 0.190000 3 | 0.271000 5 | 0.409510 10 | 0.651322 15 | 1.245066 20 | 1.486676 25 | 2.119910 30 | 2.362563 40 | 3.258807 50 | 4.167839 75 | 6.695542 100 | 8.813212 200 | 18.314546 500 | 47.328320 Как видно, отношение M[N] / N тем ближе к 0.1, чем больше количество горгон в отряде* * Начиная с некоторого N, когда основной вклад в мат. ожидание вносит P[N, ceil(N/10)] Теперь это больше похоже на правду. |
|
|
|
13 Sep 2012, 11:15
(Сообщение отредактировал Sav - 13 Sep 2012, 11:16)
Сообщение
#59
|
|
|
Immortal Сообщений: 9 448 Спасибо сказали: 4000 раз |
Хм, я дейстительно ошибся на одно деление на 2, там и вправду ограничение (N + 9)/10.
Только непонятно - почему с гораздо более мягким ограничением сверху (N + 9)/5 для 100 горгон получилось всего 3 убийства в среднем? |
|
|
|
13 Sep 2012, 14:13
(Сообщение отредактировал AlexSpl - 13 Sep 2012, 14:14)
Сообщение
#60
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз |
Цитата Только непонятно - почему с гораздо более мягким ограничением сверху (N + 9)/5 для 100 горгон получилось всего 3 убийства в среднем? Из-за описки: Код int x = 0; for (int i = 0; i < gorgons_count; i++) { if (1 + rand()%100 <= 10) x++; } x = min(x, (x + 9)/5); Нужно: Код int x = 0;
for (int i = 0; i < gorgons_count; i++) { if (1 + rand()%100 <= 10) x++; } x = min(x, (gorgons_count + 9)/5); |
|
|
|
![]() ![]() |
| Текстовая версия | Сейчас: 13 November 2025 - 22:08 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|