Форум программистов, компьютерный форум CyberForum.ru

Математическое ожидание, дисперсия - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.90
Ailuna
2 / 2 / 0
Регистрация: 16.11.2010
Сообщений: 29
15.06.2011, 12:19     Математическое ожидание, дисперсия #1
Добрый день, помогите пожалуйста решить такую задачу:

На отрезке АВ длины а выбраны наудачу два отрезка одинаковой длины с . Найти математическое ожидание и дисперсию длины, перекрытой обоими этими отрезками (т.е.их общей части)
Промоделировать задачу на компьютере,взяв а=20см, с=10см, и повторив эксперимент 1000раз
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
15.06.2011, 23:38     Математическое ожидание, дисперсия #21
grizlik78, раз уж готовое решение выложили, то предложу упрощение: искомую случайную величину можно свести к расстоянию между двумя случайными точками из единичного отрезка. Эту эквивалентную задачу проще и программировать, и аналитически решать. А при выводе результатов уже вернуться к исходной.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
15.06.2011, 23:44     Математическое ожидание, дисперсия #22
volovzi, кажется, у этого расстояния распределение плотности имеет вид треугольника, не помню, есть ли у него особое название. Что-то сомнительно, что его можно проще смоделировать. Если можно — показывай как
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.06.2011, 00:15     Математическое ожидание, дисперсия #23
Что именно показать? Программу?
Ну, я делал так:
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 <vector>
#include <cmath>
#include <numeric>
 
double drandom ()
{
    return static_cast<double>(random()) / RAND_MAX;
}
 
double random_distance ()
{
    return fabs(drandom() - drandom());
}
 
int main ()
{
    std::vector<double> values(1000);
    
    srandom(time(NULL));
    
    for (int i = 0; i < values.size(); ++i)
    {
        values[i] = random_distance();
    }
    
    std::cout << std::accumulate(values.begin(), values.end(), .0) / values.size() << std::endl;
    
    return 0;
}
Здесь у меня рассчитывается среднее расстояния между двумя случайными точками на единичном отрезке.
Чтобы перейти к исходной задаче, нужно представить эти точки как начала единичных отрезков в более широком отрезке — [0; 2], и тогда расстояние между ними будет долей, по которой отрезки не пересекаются. Соответственно, если эта доля — x, то 1 – x — доля пересечения.
А дальше нужно только умножить эту долю на настоящую длину отрезка, то есть на десять, в данном случае.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
16.06.2011, 00:26     Математическое ожидание, дисперсия #24
А я как-то не вижу отличий (с учётом всё-равно необходимого умножения и проверки условий, на случай если a > 2*c). Формулу выводить да, наверное попроще. А модель у меня получилась прямо по заданию, а переход к нормализованной СВ несколько усложнит сопоставление.
Формулу выводить — наверное да, проще.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.06.2011, 00:44     Математическое ожидание, дисперсия #25
grizlik78, да, умножение делать придётся всё равно. Но не дважды в каждом испытании (всего две тысячи), а один раз на всю программу .
И потом, нормализация упростит и аналитическое решение, и моделирование, и сопоставление.
А уже конечный результат можно привести к начальному условию.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
16.06.2011, 00:50     Математическое ожидание, дисперсия #26
Цитата Сообщение от volovzi Посмотреть сообщение
Но не дважды в каждом испытании (всего две тысячи), а один раз на всю программу .
Ну тебя же не смущает 2000 делений на RAND_MAX
А величину (a-c)/RAND_MAX можно было вычислить 1 раз, и вместо делений умножать на эту величину. В общем это вопрос восприятия, мне кажется проще так, тебе так, а кому-то может совсем по другому. А ускорять одноразовые вычисления смысла мало.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.06.2011, 01:12     Математическое ожидание, дисперсия #27
Если уж на то пошло, то можно вместо "drandom" использовать системную "drand48", и вообще избавиться от дополнительных операций.
И это не ускорение, это антизамедление .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2011, 02:47     Математическое ожидание, дисперсия
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
16.06.2011, 02:47     Математическое ожидание, дисперсия #28
А я не поленился и вынес в своём варианте умножение из функции.
на 100 миллионах (компиляция с ключом -O2) время оказалось сравнимым. 3,70 c до, 3,75 c после.
Убрал условия и параметры (что сделало модель менее универсальной), получил 3,66 c.
Не слишком заметный выигрыш, чтобы ради него делать менее (для меня) понятной и менее универсальной. Тем более, что это всё в пределах погрешности.

Переход к drand48() дал время 4,50 с. Может генератор и получился более качественным (не сравнивал, хоть и сомнительно), но явно не более быстрым. Я бы предпочёл тогда уж Вихрь Мерсенна или ещё какой более интересный генератор.

Лишь замена обмена значений модулем дала заметный (и несколько неожиданный для меня) эффект: 2.80 c. Но и в первоначальной версии эффект тот же (даже чуть лучше). В который раз убеждаюсь, что пути компилятора неисповедимы

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

P.S. Переделывая сначала получал неверный результат, так как неправильно делал пересчёт МО и дисперсии. В исходном варианте места для этих ошибок не нашлось. Так что для меня в нормализации (в этой конкретной задаче) одни минусы.

Добавлено через 6 минут
Ах, да. Замечу ещё, что на самом деле различия могли оказаться ещё меньше, если бы я честно выделял память под все 100000000 значений, что необходимо для оценки дисперсии. У меня был массив на 10 тыс. элементов, что, разумеется, дало дисперсию лишь по этим 10 тысячам.
Yandex
Объявления
16.06.2011, 02:47     Математическое ожидание, дисперсия
Ответ Создать тему
Опции темы

Текущее время: 01:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru