С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nic2009nik
1 / 1 / 0
Регистрация: 21.10.2012
Сообщений: 34
#1

теория вероятности на эвм - C++

21.09.2013, 23:19. Просмотров 965. Ответов 11
Метки нет (Все метки)

задание: три орудия производят стрельбу по трем целям. каждое орудие выбирает себе цель случайно,независимо от других.цель одним орудием поражается с вероятностью0,6. требуется осуществить моделирование этого эксперимента па пэвм.повторить эксперимент н раз в одних и тех же условиях и подсчитать относительную частоту события а= из трех целей поражены только две.
теоретически задача решается по формуле полной вероятности. эксперимент двухэтапный 1 этап- сколько мешеней будем обстереливать, 2-епосредственно стрельба, вычисление условных вероятностей. проблема в том, что не могу понять, как смоделировать,написать прогу, ПОМОГИТЕ!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2013, 23:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос теория вероятности на эвм (C++):

Теория вероятности. - C++
Начал изучать предмет который упомянут в теме. И на данную дисциплину не нашел задач, чтобы запрограммировать на плюсах. Если кто знает...

Теория вероятности - C++
Для участия в судебном процессе из 20 потенциальных кандидатов, среди которых 8 женщин и 12 мужчин, выбирают 6 присяжных заседателей. После...

Работа с массивом, теория вероятности - C++
Здравствуйте. Задали задачку: Есть генератор случайных чисел, каждые 15 секунд в конец массива поступает число. В массиве уже...

Имитационная модель, теория вероятности - C++
Здравствуйте! Тут есть задачка: Разработайте и запрограммируйте имитационная модель, которая позволяет определить вероятность того,...

Структура "ЭВМ". Определить какая ЭВМ имеет минимальное отношение стоимость/быстродействие - C++
Даны 3 ЭВМ , известны объемы памяти, цена и быстродействие. Определить какая ЭВМ имеет минимальное отношение стоимости/быстродействию и...

"Теория вероятности Шейтона" и "Кодирование/дикодирование информации" (C++) - C++
Всем здравструйте! :) Есть две задачки: "Теория вероятности Шейтона" и "Кодирование/декодирование информации". Код первой: Задание...

11
egor2116
342 / 373 / 42
Регистрация: 20.01.2013
Сообщений: 1,132
21.09.2013, 23:27 #2
Наверное нужно использовать генератор случайных чисел.
C++
1
2
srand(time(0));
rand();
0
nic2009nik
1 / 1 / 0
Регистрация: 21.10.2012
Сообщений: 34
21.09.2013, 23:31  [ТС] #3
это ничем не поможет.
0
egor2116
342 / 373 / 42
Регистрация: 20.01.2013
Сообщений: 1,132
21.09.2013, 23:34 #4
А что бы помогло?
1
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
22.09.2013, 00:00 #5
Цитата Сообщение от nic2009nik Посмотреть сообщение
задание: три орудия производят стрельбу по трем целям. каждое орудие выбирает себе цель случайно,независимо от других.цель одним орудием поражается с вероятностью0,6. требуется осуществить моделирование этого эксперимента па пэвм.повторить эксперимент н раз в одних и тех же условиях и подсчитать относительную частоту события а= из трех целей поражены только две.
теоретически задача решается по формуле полной вероятности. эксперимент двухэтапный 1 этап- сколько мешеней будем обстереливать, 2-епосредственно стрельба, вычисление условных вероятностей. проблема в том, что не могу понять, как смоделировать,написать прогу, ПОМОГИТЕ!!

Не по теме:

Проблема состоит не в том, что Вы не можете написать "прогу", а в том, что Вы писать вообще не можете. Уважайте тех, кто пытаются Вам помочь, пишите если не граммотно, то хотя бы придерживаясь типографским правилам: каждое предложение и имена собственные начинаются с прописной буквы, любой знак (запятая, точка, восклицательный и вопросительный знаки и так далее) пишется слитно (вместе) с последним словом и раздельно (через пробел) со следующим словом. Очень простые правила и очень сложно читать текст, напечатанный не по этим правилам, даже безграммотность так не убивает...


Всё ну очень просто. Берём, и стреляем! Очень сложно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstdlib>
using namespace std;
 
int fire ( double chance ) {
    int res = rand () % 3;
    if ( rand () / double(RAND_MAX) < chance ) {
        return res + 1;
    }
 
    return 0;
}
 
int main() {
    double A = 0;
    for ( int i = 0; i < 100000; i++ ) {
        int one   = fire ( 0.6 ),
            two   = fire ( 0.6 ),
            three = fire ( 0.6 );
 
        if ( one == two && three != one || one == three && two != one ) {
            A++;
        }
    }
 
    cout << A / 100000 << endl;
 
    return 0;
}
UPD:
Цитата Сообщение от egor2116 Посмотреть сообщение
Наверное нужно использовать генератор случайных чисел.
Цитата Сообщение от nic2009nik Посмотреть сообщение
это ничем не поможет.
Цитата Сообщение от egor2116 Посмотреть сообщение
А что бы помогло?
Действительно, поведайте нам, раз уж Вы знаете, что, в рамках данной задачи, требуется использовать.
1
zer0mail
2379 / 2010 / 200
Регистрация: 03.07.2012
Сообщений: 7,252
Записей в блоге: 1
22.09.2013, 01:09 #6
Имхо,
Цитата Сообщение от nic2009nik Посмотреть сообщение
это ничем не поможет
следует читать "это ничем мне не поможет"
0
nic2009nik
1 / 1 / 0
Регистрация: 21.10.2012
Сообщений: 34
23.09.2013, 13:25  [ТС] #7
AnyOne697, замечание по поводу правил оформления текста учту.
На всякий случай, "грамотно" пишется с одной буквой "м" и во фразе "Берем и стреляем" запятая не нужна.
Теперь по делу, мне действительно было не очень понятно как можно использовать генератор случайных чисел
применительно к данной задаче, поэтому и прошу развернутых объяснений.
Спасибо за код, но не понял, что значит res?? И может быть в последнем if добавить еще two == three && one != two
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
23.09.2013, 13:41 #8

Не по теме:

Цитата Сообщение от nic2009nik Посмотреть сообщение
На всякий случай, "грамотно" пишется с одной буквой "м" и во фразе "Берем и стреляем" запятая не нужна.
Ну да, так есть. Ошибся. Спасибо. Впрочем, я не спорю, людям свойственно ошибаться. Но ошибаться, а не делать вопреки систематически.


Цитата Сообщение от nic2009nik Посмотреть сообщение
Теперь по делу, мне действительно было не очень понятно как можно использовать генератор случайных чисел
применительно к данной задаче, поэтому и прошу развернутых объяснений.
Далее, не понял, что значит res?? И может быть в последнем if добавить еще two == three && one != two
Данная задача - симуляция случайных событий. Они по умолчанию случайны и без привлечения к симуляции случайных велечин она не решаема на ЭВМ. К счастью, можно построить ряд чисел, который будет похожим на случайный, используя только математические операции. Собственно, поэтому и используем int rand(), подругому никак.
int res - сокращение от английского result, очень похожего на русское слово результат. Собственно, это результат работы функции
C++
1
int fire ( double chance )
, который мы впоследствии возвращаем. На самом деле, она там не нужна, и можно чуть проще.
Чуть проще.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cstdlib>
using namespace std;
 
int fire ( double chance ) {
    if ( rand () / double(RAND_MAX) < chance ) {
        return ( rand () % 3 ) + 1;
    }
 
    return 0;
}
 
int main() {
    double A = 0;
    for ( int i = 0; i < 100000; i++ ) {
        int one   = fire ( 0.6 ),
            two   = fire ( 0.6 ),
            three = fire ( 0.6 );
 
        if ( one == two && three != one || one == three && two != one || two == three && one != two ) {
            A++;
        }
    }
 
    cout << A / 100000 << endl;
 
    return 0;
}

Цитата Сообщение от nic2009nik Посмотреть сообщение
two == three && one != two
Ошибка найдена, будем считать материал усвоеным =)
А если быть честным, то я минут пять сидел и пытался просчитать все возможные вариант, хотя я знал, что из формулы количества сочетаний мы имеем ровно 3! / ( 2! * 1! ) = 3. То есть ещё одного варианта не хватает, точно такого, который Вы и нашли.
1
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 260
23.09.2013, 13:45 #9
изначально res вибирает мишень и возвращает ее номер при попадании. т.к. используетс остаток от деления, то индексация мишеней получается начинается с нуля. именно поэтому перед возвратом значение res увеличивается. Да и при промахе функция возвращает 0

Более того мне не понятен иф в конце, т.к. промахи получается тоже учитываются что ни есть гуд. Т.К. при 2 промахах и одном попадании получается счетчик наступлений события а увеличивается
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
23.09.2013, 13:47 #10
Цитата Сообщение от HedgehogLu Посмотреть сообщение
Более того мне не понятен иф в конце, т.к. промахи получается тоже учитываются что ни есть гуд. Т.К. при 2 промахах и одном попадании получается счетчик наступлений события а увеличивается
К слову да. Но бодем считать такую вероятность ничтожно малой =)
Идеальный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cstdlib>
using namespace std;
 
int fire ( double chance ) {
    if ( rand () / double(RAND_MAX) < chance ) {
        return ( rand () % 3 ) + 1;
    }
 
    return 0;
}
 
int main() {
    double A = 0;
    for ( int i = 0; i < 100000; i++ ) {
        int one   = fire ( 0.6 ),
            two   = fire ( 0.6 ),
            three = fire ( 0.6 );
 
        if ( one == two && three != one && one != 0 ||
        one == three && two != one && one != 0 ||
        two == three && one != two && two != 0 ) {
            A++;
        }
    }
 
    cout << A / 100000 << endl;
 
    return 0;
}
0
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 260
23.09.2013, 13:57 #11
имхо это грубо нарушение алгоритмики а не ничтожно малое отклонение.
более того подсчет попаданий можно считать более просто
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    double A = 0;
    small targets[4];
    for ( int i = 0; i < 100000; i++ ) 
    {
        targets[0]=0;
        targets[1]=0;
        targets[2]=0;
        targets[3]=0;
        targets[fire ( 0.6 )]=1;
        targets[fire ( 0.6 )]=1;
        targets[fire ( 0.6 )]=1;
        if ((targets[1]+targets[2]+targets[3])==2) A++;
     }
    cout << A / 100000 << endl;
    return 0;
}
0
nic2009nik
1 / 1 / 0
Регистрация: 21.10.2012
Сообщений: 34
23.09.2013, 14:30  [ТС] #12
Цитата Сообщение от AnyOne697 Посмотреть сообщение
К слову да. Но бодем считать такую вероятность ничтожно малой =)
Разница между теоретическим ответом и тем, что получаем здесь около 0,2, признать ее ничтожно малой, увы, не выйдет.

Добавлено через 12 минут
HedgehogLu, спасибо. у Вас самое точное решение.
0
23.09.2013, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2013, 14:30
Привет! Вот еще темы с ответами:

ОС и архитектура ЭВМ - C++
Скажите, а насколько важно программисту важно знать принципы работы операционной системы, архитектуру ЭВМ? В каких областях применения С++...

Архитектура ЭВМ на С++ - C++
1. Определить режимы работы каналов таймера. 2. Реализовать программу генерации звука с определением частоты звучания случайным...

Немного из архитектуры ЭВМ - C++
Пусть заданы две квадратных матрицы A и B размером NxN. Они созданы с помощью двух подходов: 1 подход: int **A; A = new int*; ...

эвм-умножение со сдвигом влево на c++ - C++
задали лабораторную,нужно написать программу на c++ которая производит умножение со сдвигом влево.позно вспомнила,не успеваю.подскажите как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.