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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.90
Ailuna
2 / 2 / 0
Регистрация: 16.11.2010
Сообщений: 29
#1

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

15.06.2011, 12:19. Просмотров 5197. Ответов 27
Метки нет (Все метки)

Добрый день, помогите пожалуйста решить такую задачу:

На отрезке АВ длины а выбраны наудачу два отрезка одинаковой длины с . Найти математическое ожидание и дисперсию длины, перекрытой обоими этими отрезками (т.е.их общей части)
Промоделировать задачу на компьютере,взяв а=20см, с=10см, и повторив эксперимент 1000раз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2011, 12:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Математическое ожидание, дисперсия (C++):

Использование подпрограммы-процедуры. Математическое ожидание и дисперсия - C++
Нужно найти математическое ожидание и дисперсию случайных величин, записанных в массивах Х(10), У(15). Помогите, надо сдать, а я догнать не...

Найти математическое ожидание, дисперсию, и среднее квадратичное - C++
извините, я новичок на форуме и не знаю куда податься дана задача: задается таблица: x| x1 | x2 | x3 | xn |x++... | p| p1...

Требуется определить математическое ожидание в каждом массиве - C++
Доброго времени суток ребята! Мне нужна ваша помошь. Нужно решить вот такую вот задачу: "имеется несколько массивов данных (разного...

Определить математическое ожидание дискретной случайной величины - C++
помогите решить задачи на C или C++: 1Дан двумерный массив элементов иллюстрирующий закон распределения дискретной случайно велечины ....

Вычислить математическое ожидание, дисперсию и среднеквадратичное отклонение случайной величины - C++
Пусть массив X(N) - массив возможных значений некоторых случайных величин. Составить подпрограмму, которая вычисляет математическое...

Дисперсия, массив - C++
Найти дисперсию элементов массива из символов.

27
Ailuna
2 / 2 / 0
Регистрация: 16.11.2010
Сообщений: 29
15.06.2011, 22:58  [ТС] #16
ой,мне это не осилить, лучше на С++,можете пожалуйста посмотреть на программу выше, что там не так?
0
shilovec5377
29 / 54 / 1
Регистрация: 26.05.2011
Сообщений: 752
15.06.2011, 23:04 #17
а, ЧТО ТАМ НЕ ТАК ВРОДЕ БЫ РАБОТАЕТ!!
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
15.06.2011, 23:08 #18
Добавьте
C
1
#include <time.h>
0
Ailuna
2 / 2 / 0
Регистрация: 16.11.2010
Сообщений: 29
15.06.2011, 23:17  [ТС] #19
добавила - работает!) но мне задано промоделировать 1000 раз, а программа выводит только одно значения МО и Дисперсии, или я опять что то не поняла?типа табуляция должна быть?в какой среде вы писали,у меня NetBeans.может он глючит?
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
15.06.2011, 23:31 #20
Оценить мат. ожидание или дисперсию по одному эксперименту невозможно. Эксперимент — это случайный выбор двух отрезков и определение длины их общей части.
В данном случае для этого проводится N экспериментов. Число N согласно заданию определено как 1000. Чем больше экспериментов, тем точнее оценка.
Как вы собирались анализировать 1000 результатов? А если бы задали миллион?

Добавлено через 8 минут
На самом деле тут нечего особо комментировать. Теорию бы немножко подучить
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/* Количество экспериментов */
#define N 1000
/* Интервал размещения отрезков */
#define A 20.0
/* Длина отрезков */
#define C 10.0
 
/* Функция возвращает случайную величину, равную
 * длине общей части двух отрезков длиной c
 * из интервала длиной a
 */
float get_random_len(float a, float c)
{
    float x1, x2;
    if (a < c)
        return 0;
    /* Выбираем случайно начала двух отрезков x1 и x2.
     * Чтобы отрезуи попадали в диапазон [0; a] их начало
     * должно попадать в диапазон [0; a-c]
     */
    x1 = rand()*(a-c)/(RAND_MAX+1.0);
    x2 = rand()*(a-c)/(RAND_MAX+1.0);
    /* Возможно 4 варианта размещения отрезков.
     * Сокращаем до двух, сделав x1 <= x2
     */
    if (x2 < x1)
        { float tmp = x1; x1 = x2; x2 = tmp; };
    if (x1 + c < x2) /* Отрезки не пересекаются */
        return 0;
    return x1 + c - x2; /* Отрезки пересекаются */
}
 
int main()
{
    int i;
    float len[N];
    float m = 0, disp = 0;
    srand(time(NULL)); /* Инициализация ГПСЧ */
 
    for (i = 0; i < N; ++i)
    {
        /* Получаем очередное значение длины */
        len[i] = get_random_len(A, C);
        /* Суммируем длины для нахождения среднего */
        m += len[i];
    }
    m /= N; /* Выборочное среднее (оценка МО) */
 
    for (i = 0; i < N; ++i)
    {
        /* Центрируем для нахождения дисперсии */
        float cval = len[i] - m;
        /* Суммируем квадраты */
        disp += cval*cval;
    }
    disp /= N; /* Оценка дисперсии */
 
    printf("mean: %f\ndisp: %f\n", m, disp);
 
    return 0;
}
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
15.06.2011, 23:38 #21
grizlik78, раз уж готовое решение выложили, то предложу упрощение: искомую случайную величину можно свести к расстоянию между двумя случайными точками из единичного отрезка. Эту эквивалентную задачу проще и программировать, и аналитически решать. А при выводе результатов уже вернуться к исходной.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
15.06.2011, 23:44 #22
volovzi, кажется, у этого расстояния распределение плотности имеет вид треугольника, не помню, есть ли у него особое название. Что-то сомнительно, что его можно проще смоделировать. Если можно — показывай как
0
volovzi
267 / 169 / 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 — доля пересечения.
А дальше нужно только умножить эту долю на настоящую длину отрезка, то есть на десять, в данном случае.
1
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
16.06.2011, 00:26 #24
А я как-то не вижу отличий (с учётом всё-равно необходимого умножения и проверки условий, на случай если a > 2*c). Формулу выводить да, наверное попроще. А модель у меня получилась прямо по заданию, а переход к нормализованной СВ несколько усложнит сопоставление.
Формулу выводить — наверное да, проще.
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.06.2011, 00:44 #25
grizlik78, да, умножение делать придётся всё равно. Но не дважды в каждом испытании (всего две тысячи), а один раз на всю программу .
И потом, нормализация упростит и аналитическое решение, и моделирование, и сопоставление.
А уже конечный результат можно привести к начальному условию.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
16.06.2011, 00:50 #26
Цитата Сообщение от volovzi Посмотреть сообщение
Но не дважды в каждом испытании (всего две тысячи), а один раз на всю программу .
Ну тебя же не смущает 2000 делений на RAND_MAX
А величину (a-c)/RAND_MAX можно было вычислить 1 раз, и вместо делений умножать на эту величину. В общем это вопрос восприятия, мне кажется проще так, тебе так, а кому-то может совсем по другому. А ускорять одноразовые вычисления смысла мало.
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.06.2011, 01:12 #27
Если уж на то пошло, то можно вместо "drandom" использовать системную "drand48", и вообще избавиться от дополнительных операций.
И это не ускорение, это антизамедление .
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
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 тысячам.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2011, 02:47
Привет! Вот еще темы с ответами:

Выборочное среднее и выборочная дисперсия - C++
Здравствуйте. Есть показательное распределение (левое). Промоделировано 1000 значений методом обратной функции. Теперь нужно вывести на...

Дисперсия выборки из пяти заданных чисел - C++
задание: Запишите алгоритм программы, определяющей дисперсию выборки из пяти заданных чисел. Составьте программу на языке С++,...

математическое решение в С - C++
Решите пожалуйста в С

математическое решение в С - C++
Решите пожалуйста в С : Составить программу для вычисления значений функции F(x) на отрезке с шагом h. Результат представить в виде...


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

Или воспользуйтесь поиском по форуму:
28
Yandex
Объявления
16.06.2011, 02:47
Ответ Создать тему
Опции темы

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