Помощь - Поиск - Пользователи - Календарь
Полная версия: Интересная задача, помогите решить > Теория вероятностей
Образовательный студенческий форум > Высшая математика > Теория вероятностей
BlackGad
Столкнулся с задачей - условно есть 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


примеры сгенерированы и подсчитаны обычной симуляцией, нужно определить математическую формулу распределения.

Могу начертить графики распределения smile.gif если необходимо...
Помогите пожалуйста.
malkolm
А каким образом выбирается, куда кто стреляет?
BlackGad
Цитата(malkolm @ 20.1.2009, 22:38) *

А каким образом выбирается, куда кто стреляет?


алгоритм симуляции

для каждого атакера из всех атакеров
рандом от 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
А по-русски можно? Подробно механизм: кто куда стреляет? Или как определяется количество попаданий по данному защитнику Васе Пупкину?
BlackGad
Цитата(malkolm @ 20.1.2009, 22:54) *

А по-русски можно? Подробно механизм: кто куда стреляет? Или как определяется количество попаданий по данному защитнику Васе Пупкину?


каждый атакующий стреляет 1 раз, причем всегда попадает в противника.

выбор цели для атакующего равновероятный - тоесть (1 любой защитник).
после того, как выстрелили все атакующие: производится подсчет защитников,
1 группа - защитники по которым не попали
2 группа - защитники по которым попали 1 раз
3 группа - защитники по которым попали 2 раза
.....
n группа - защитники по которым попали n+1 раз

если просуммировать количество защитников всех групп - получится общее количество защитников(2000)

теперь определяем количество атакующих для всех групп
1 группа - игнорируется
2 группа - количество атакующих на эту группу = количеству группы*1
3 группа - количество атакующих на эту группу = количеству группы*2
.....
n группа - количество атакующих на эту группу = количеству группы*(n+1)

ну и выводим процент распределения - количество атакующих группы / на общее количество атакующих

нужно найти мат формулу, которая определяет процент распределения без симуляции.
malkolm
Понятно теперь, кто куда стреляет, непонятно другое. Числа, которе Вы получаете в результате моделирования, случайны. Количество защитников, в которых никто не стрелял, может быть любым от 0 до общего числа защитников минус 1. Точно так же количество защитников, в которых стрелял кто-то один, может быть любым от 0 до числа защитников. Ну и т.д. все эти числа есть случайные величины. Их нельзя найти ни по какой формуле.

Точно так же, как, бросая монету 10 раз, нельзя ни по какой формуле найти число выпавших орлов. Бросите сегодня - выпадет 4 орла. Завтра - 5, послезавтра - 2. А у меня вчера выпало 10.

Говорить тут можно только о нахождении каких-то вероятностей или математических ожиданий (средних значений). Но это Вы должны определиться, что именно хотите найти. Случайные величины не ищут, на то они и случайны.
BlackGad
smile.gif именно средние значение и нужны, я наверно, просто, не так выразился.

собственно могу вот 3 рисунка для 3 симуляций 1 исходных данных...

Изображение
Изображение
Изображение

надо найти среднее распределение... Теорию вероятности я подзабыл уже( потому ищу помощи
malkolm
Картинки ничего не объясняют. Ещё раз - на этих картинках для каждой отдельной серии экспериментов какие-то значения случайных величин получаются. Толку от них никакого. Я понимаю, что Вы тервер забыли, но чтобы что-то искать, нужно точно представлять, что именно.

Вас интересует вектор из матожиданий (средних значений) величин X(0),...,X(n), где X(i) - число защитников, атакованных i нападающими (или, что безразлично, доля к общему числу нападающих)?

Если так ставить задачу, можно подумать, это не должно быть сложно.
BlackGad
Да(судя по определению в вики smile.gif ) нужно найти вектор мат ожиданий величин для доли к общему числу нападающих...

Прошу прощения за неправильную постановку задачи
malkolm
Пусть есть 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
Цитата(malkolm @ 21.1.2009, 0:18) *

Пусть есть 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.
Для "долей" - просто поделите результаты на число нападающих.


то, что нужно... спасибо вам thumbsup.gif
malkolm
Не за что, это не сложно. Вероятности искать было бы хуже smile.gif
Игрушку делаете?
BlackGad
мм а можно пример для 2 и 3 выстрелов, а то либо я в формулу не так подставил, либо что-то не то выходит?

smile.gif игрушка есть уже... но бои по 25 сек считаются для 200000 выстрелов... а это далеко не предел того, что может быть, ищем оптимизацию.

И возможно есть более простые формулы? те степень 1999 это многовато)... возможно есть хоть ссылки на подобные статьи, материалы?
malkolm
Возводить в большую степень можно с помощью логарифмирования: 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
спасибо smile.gif

есть мысль просто зарание просчитать для прорции атакера/защитника занести в масив и множить мгновенно... только вот точность страдать будет smile.gif

на глаз видно быть не должно, при милионных толпах
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2025 Invision Power Services, Inc.