![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
BlackGad |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Продвинутые Сообщений: 8 Регистрация: 20.1.2009 Город: Житомир ![]() |
Столкнулся с задачей - условно есть 2 шеренги стрелков, одна из них атакующая, вторая оборонительная. Атакующая производит залп.
Задача: определить процент попадания Атакующих солдат по 1, 2, 3, ... раз по 1 воину обороны. попадание атакующих солдат 100%. пример 1: атакующих 2000 оборонительных 2000 распределение: попаданий|количество атакующих|процент от общего числа атакующих 1 |797 |0,3985 2 |722 |0,361 3 |348 |0,174 4 |108 |0,054 5 |25 |0,0125 Сумма |2000 пример 2: атакующих 1000 оборонительных 2000 распределение: попаданий|количество атакующих|процент от общего числа атакующих 1 |591 |0,591 2 |306 |0,306 3 |84 |0,084 4 |4 |0,004 5 |15 |0,015 Сумма 1000 пример 3: атакующих 2000 оборонительных 1000 распределение: попаданий|количество атакующих|процент от общего числа атакующих 1 |258 |0,129 2 |538 |0,269 3 |546 |0,273 4 |396 |0,198 5 |180 |0,09 6 |60 |0,03 7 |14 |0,007 8 |8 |0,004 Сумма 2000 примеры сгенерированы и подсчитаны обычной симуляцией, нужно определить математическую формулу распределения. Могу начертить графики распределения (IMG:style_emoticons/default/smile.gif) если необходимо... Помогите пожалуйста. |
malkolm |
![]()
Сообщение
#2
|
Старший преподаватель ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 2 167 Регистрация: 14.6.2008 Город: Н-ск Вы: преподаватель ![]() |
А каким образом выбирается, куда кто стреляет?
|
BlackGad |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Продвинутые Сообщений: 8 Регистрация: 20.1.2009 Город: Житомир ![]() |
А каким образом выбирается, куда кто стреляет? алгоритм симуляции для каждого атакера из всех атакеров рандом от 1 до количества защитников количество попаданий по данному защитнику + 1 далее просто группировка по количеству попаданий всех защитников если шарп или с++ знаком то вот: int attackCount = 1000; int defendCount = 2000; Random r = new Random(); for (int i = 0; i < attackCount; i++) { int index = r.Next(defendCount); if (!attack.ContainsKey(index)) attack.Add(index, 0); // если в списке цели с индексом index нет, добавляем новую запись с 0 попаданий attack[index]++; //добавляем попадание по защитнику с индексом index } |
malkolm |
![]()
Сообщение
#4
|
Старший преподаватель ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 2 167 Регистрация: 14.6.2008 Город: Н-ск Вы: преподаватель ![]() |
А по-русски можно? Подробно механизм: кто куда стреляет? Или как определяется количество попаданий по данному защитнику Васе Пупкину?
|
BlackGad |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Продвинутые Сообщений: 8 Регистрация: 20.1.2009 Город: Житомир ![]() |
А по-русски можно? Подробно механизм: кто куда стреляет? Или как определяется количество попаданий по данному защитнику Васе Пупкину? каждый атакующий стреляет 1 раз, причем всегда попадает в противника. выбор цели для атакующего равновероятный - тоесть (1 любой защитник). после того, как выстрелили все атакующие: производится подсчет защитников, 1 группа - защитники по которым не попали 2 группа - защитники по которым попали 1 раз 3 группа - защитники по которым попали 2 раза ..... n группа - защитники по которым попали n+1 раз если просуммировать количество защитников всех групп - получится общее количество защитников(2000) теперь определяем количество атакующих для всех групп 1 группа - игнорируется 2 группа - количество атакующих на эту группу = количеству группы*1 3 группа - количество атакующих на эту группу = количеству группы*2 ..... n группа - количество атакующих на эту группу = количеству группы*(n+1) ну и выводим процент распределения - количество атакующих группы / на общее количество атакующих нужно найти мат формулу, которая определяет процент распределения без симуляции. |
malkolm |
![]()
Сообщение
#6
|
Старший преподаватель ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 2 167 Регистрация: 14.6.2008 Город: Н-ск Вы: преподаватель ![]() |
Понятно теперь, кто куда стреляет, непонятно другое. Числа, которе Вы получаете в результате моделирования, случайны. Количество защитников, в которых никто не стрелял, может быть любым от 0 до общего числа защитников минус 1. Точно так же количество защитников, в которых стрелял кто-то один, может быть любым от 0 до числа защитников. Ну и т.д. все эти числа есть случайные величины. Их нельзя найти ни по какой формуле.
Точно так же, как, бросая монету 10 раз, нельзя ни по какой формуле найти число выпавших орлов. Бросите сегодня - выпадет 4 орла. Завтра - 5, послезавтра - 2. А у меня вчера выпало 10. Говорить тут можно только о нахождении каких-то вероятностей или математических ожиданий (средних значений). Но это Вы должны определиться, что именно хотите найти. Случайные величины не ищут, на то они и случайны. |
BlackGad |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Продвинутые Сообщений: 8 Регистрация: 20.1.2009 Город: Житомир ![]() |
(IMG:style_emoticons/default/smile.gif) именно средние значение и нужны, я наверно, просто, не так выразился.
собственно могу вот 3 рисунка для 3 симуляций 1 исходных данных... (IMG:http://s44.radikal.ru/i104/0901/e8/be349b906dd7.jpg) (IMG:http://s46.radikal.ru/i114/0901/d7/a6dc38304b1f.jpg) (IMG:http://s43.radikal.ru/i099/0901/8d/9c213bf75371.jpg) надо найти среднее распределение... Теорию вероятности я подзабыл уже( потому ищу помощи |
malkolm |
![]()
Сообщение
#8
|
Старший преподаватель ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 2 167 Регистрация: 14.6.2008 Город: Н-ск Вы: преподаватель ![]() |
Картинки ничего не объясняют. Ещё раз - на этих картинках для каждой отдельной серии экспериментов какие-то значения случайных величин получаются. Толку от них никакого. Я понимаю, что Вы тервер забыли, но чтобы что-то искать, нужно точно представлять, что именно.
Вас интересует вектор из матожиданий (средних значений) величин X(0),...,X(n), где X(i) - число защитников, атакованных i нападающими (или, что безразлично, доля к общему числу нападающих)? Если так ставить задачу, можно подумать, это не должно быть сложно. |
BlackGad |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Продвинутые Сообщений: 8 Регистрация: 20.1.2009 Город: Житомир ![]() |
Да(судя по определению в вики (IMG:style_emoticons/default/smile.gif) ) нужно найти вектор мат ожиданий величин для доли к общему числу нападающих...
Прошу прощения за неправильную постановку задачи |
malkolm |
![]()
Сообщение
#10
|
Старший преподаватель ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 2 167 Регистрация: 14.6.2008 Город: Н-ск Вы: преподаватель ![]() |
Пусть есть m ящиков (защитники) и n шариков (нападающие). Каждый шарик с равной вероятностью и независимо от других кладётся в любой из m ящиков.
Пусть X(0) - число пустых ящиков, X(1) - число ящиков с одним шариком и т.д. до X(n) - числа ящиков с n шариками. Тогда математическое ожидание M(X(i)) равно C_n^i * (m-1)^{n-i} / m^{n-1} = ( n! / i!*(n-i)! ) * (m-1)^{n-i} / m^{n-1}. И так по каждой компоненте при i = 0,...,n Скажем, при n=2000, m=2000, i =1 (у Вас там получалось 735, 704, 759) M(X(1)) = 2000*(1999/2000)^1999 ~ 735,9428757. Для "долей" - просто поделите результаты на число нападающих. |
BlackGad |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Продвинутые Сообщений: 8 Регистрация: 20.1.2009 Город: Житомир ![]() |
Пусть есть m ящиков (защитники) и n шариков (нападающие). Каждый шарик с равной вероятностью и независимо от других кладётся в любой из m ящиков. Пусть X(0) - число пустых ящиков, X(1) - число ящиков с одним шариком и т.д. до X(n) - числа ящиков с n шариками. Тогда математическое ожидание M(X(i)) равно C_n^i * (m-1)^{n-i} / m^{n-1} = ( n! / i!*(n-i)! ) * (m-1)^{n-i} / m^{n-1}. И так по каждой компоненте при i = 0,...,n Скажем, при n=2000, m=2000, i =1 (у Вас там получалось 735, 704, 759) M(X(1)) = 2000*(1999/2000)^1999 ~ 735,9428757. Для "долей" - просто поделите результаты на число нападающих. то, что нужно... спасибо вам (IMG:style_emoticons/default/thumbsup.gif) |
malkolm |
![]()
Сообщение
#12
|
Старший преподаватель ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 2 167 Регистрация: 14.6.2008 Город: Н-ск Вы: преподаватель ![]() |
Не за что, это не сложно. Вероятности искать было бы хуже (IMG:style_emoticons/default/smile.gif)
Игрушку делаете? |
BlackGad |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Продвинутые Сообщений: 8 Регистрация: 20.1.2009 Город: Житомир ![]() |
мм а можно пример для 2 и 3 выстрелов, а то либо я в формулу не так подставил, либо что-то не то выходит?
(IMG:style_emoticons/default/smile.gif) игрушка есть уже... но бои по 25 сек считаются для 200000 выстрелов... а это далеко не предел того, что может быть, ищем оптимизацию. И возможно есть более простые формулы? те степень 1999 это многовато)... возможно есть хоть ссылки на подобные статьи, материалы? |
malkolm |
![]()
Сообщение
#14
|
Старший преподаватель ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 2 167 Регистрация: 14.6.2008 Город: Н-ск Вы: преподаватель ![]() |
Возводить в большую степень можно с помощью логарифмирования: a^b = exp(b*ln(a)). Ну и делать это надо с дробью, а не с числителем-знаменателем в отдельности.
Для двух-трёх? M(X(2)) = (2000! / 2! * 1998!) * 1999^1998 / 2000^1999 = (2000 * 1999 /2) * (1999/2000)^1998 / 2000 = 367,9714379 (Excel) M(X(3)) = (2000! / 3! * 1997!) * 1999^1997 / 2000^1999 = (2000 * 1999 * 1998 / 6) * (1999/2000)^1997 / 2000^2 = 122,5957867 (Excel) У Вас там в картинках 0 попаданий - это, наверное, как раз 1-я группа? Для i=0 матожидание равно 735,5749043. Вообще Excel отлично это всё считает: =2000*ЧИСЛКОМБ(2000;B1)*(1999/2000)^(2000-B1)/2000^B1 Код 735,5749043 0 735,9428757 1 367,9714379 2 122,5957867 3 30,6182824 4 6,1144664 5 1,017038558 6 0,144927813 7 0,018061601 8 0,001999817 9 0,000199181 10 1,80259E-05 11 1,49464E-06 12 1,1434E-07 13 8,1181E-09 14 2000 |
BlackGad |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Продвинутые Сообщений: 8 Регистрация: 20.1.2009 Город: Житомир ![]() |
спасибо (IMG:style_emoticons/default/smile.gif)
есть мысль просто зарание просчитать для прорции атакера/защитника занести в масив и множить мгновенно... только вот точность страдать будет (IMG:style_emoticons/default/smile.gif) на глаз видно быть не должно, при милионных толпах |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 24.5.2025, 22:13 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru