Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как правильно сделать генерацию чисел


Автор: orsobruno 13.2.2011, 20:12
Помогите не математику.

Что дано. Конечное множество событий X, допустим 5. Значения также известны. Известно мат ожидание. 

Неизвестно распределение вероятностей. Собственно вопрос, не могу понять, будет ли влиять значение дисперсии на результаты. Допустим при 1 млн. генерации чисел, будет ли разница для разных вероятностей соответствующих событий. 

Ведь, насколько я понимаю, при уменьшении величины среднеквадратичного отклонения процесс становится менее случайным. Значит ли это, что становится более вероятным что выборка будет более близка к мат ожиданию, чем при распределении с большей дисперсией?

Или я совсем во всем не прав?


Всем заранее спасибо!

Автор: alexvs11 13.2.2011, 20:54
Цитата(orsobruno @  13.2.2011,  20:12 Найти цитируемый пост)
Неизвестно распределение вероятностей. Собственно вопрос, не могу понять, будет ли влиять значение дисперсии на результаты. Допустим при 1 млн. генерации чисел, будет ли разница для разных вероятностей соответствующих событий. 

дисперсия определяет возможное отклонение св от матожидания
но при достаточно большой выборке (1 млн у вас) статистические значения моментов (те те что вычислены по выборке) будут сходиться к действительным моментам
если речь идет о том, что вы хотите определить вероятность появления события X, то тут тоже все хорошо
Цитата(orsobruno @  13.2.2011,  20:12 Найти цитируемый пост)
Ведь, насколько я понимаю, при уменьшении величины среднеквадратичного отклонения процесс становится менее случайным.?

при нулевом отклонении св становится вовсе неслучайной

Цитата(orsobruno @  13.2.2011,  20:12 Найти цитируемый пост)
Значит ли это, что становится более вероятным что выборка будет более близка к мат ожиданию, чем при распределении с большей дисперсией?

да, но дело в том, что при увеличением размера выборки (колва экспериментов) можно приблизить моменты сколь угодно точно

Автор: orsobruno 13.2.2011, 21:20
Спасибо. И все же как правильно вычислить вероятности, чтобы максимально приблизить результаты выборки к мат ожиданию, я делаю просто
Код


// мат ожидание в процентах
const double gain = 98;

// все значения >0 
int w[] = {3, 30, 300, 3000};

vector<double> cumulative;

vector<int> weight(w, w + sizeof(w) / sizeof(int));

vector<double> prob;
prob.reserve(weight.size());

double total = 0;

    for (vector<int>::iterator it = weight.begin(); it != weight.end(); ++it )
    {
        total+= 1/(double)*it;
    }

    for (vector<int>::iterator it = weight.begin(); it != weight.end(); ++it )
    {
        prob.push_back( 1/((double)(*it) * total) );

    }
    total=0;
    for (unsigned int i = 0; i < weight.size(); ++i)
    {
        total+=(double)weight[i]*prob[i];
    }

    double koeff = (gain/100)/total;
    
    total = 0;

    for (unsigned int i = 0; i < weight.size(); ++i)
    {
        prob[i] = koeff*prob[i];
        total+=prob[i];
    }
        // add wining 
    double lose = 1-total;
    prob.push_back(lose);

       // затем использую распределение в генераторе
    std::partial_sum(prob.begin(), prob.begin() + prob.size(),
                    std::back_inserter(cumulative));

         boost::mt19937 gen;
....


Но по серии тестов заметил, что если назначить вероятности используя меньшее среднеквадратич отклонение, результаты выборки более близки к мат ожиданию

Автор: alexvs11 13.2.2011, 21:33
поясните вашу программу, я только понял, что prob - плотность вероятности, а cumulative видимо функция распределения
как они рассчитываются я не понял

Добавлено через 30 секунд
что за веса собсно

Автор: orsobruno 13.2.2011, 21:52
weight - это значения случайной величины.

сначала, исходя из веса, я рассчитываю вероятности, исходя из того что мат ожидание = 1

3*prob[1]+30*prob[2]+300*prob[3]+3000*prob[5] = 1

так как пользователь может выбрать Мат ожидание (у меня - gain), я корректирую вероятности под текущий gain.
Так как всегда существует еще значение случайной величины = 0, 

3*prob[1]+30*prob[2]+300*prob[3]+3000*prob[5] +0*prob[6] = gain

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)