Расчет заработной платы по теореме парето - C (СИ)
Формулировка задачи:
здравствуйте друзья! В общем описываю ситуацию: я- военный фельдшер, то есть образование средне-специальное, мотаюсь по полигонам и прочей беде всю дорогу, и черт меня дернул пойти высшее образование получать)) Пошел на платную заочку, не знаю как но доучился до 4 курса АВТФ, а какого лешего поперся именно туда-- сам толком не пойму)) приемной комиссии спросилы "вы куда хотите?" ответил--а где престижнее, я же деньги платить буду!! сказали АВТФ!! Вот и пошел, балбес! а проги писать так и не научился)) помогите полудоктору)) задача по моделированию
Создайте программу, моделирующую непрерывную случайную величину Х, подчиненную закону Парето с плотностью распределения f(x)=(3/10)*(10/х) последняя скобка в 4 степени х >10, а=3. При моделировании используйте метод обратной функции. с++ билдер у меня стоит.)) переделывать как бы научился(ну по аналогии делать) а вот блин свое с нуля создать ни как не выходит((
по правилам форума такие темя как бы не канают, но я бы знал как писать код, у Вас бы не спрашивал.(( Знаю что по теореме парето и на бумаге кое-как решил, а вот как все это в коде реализовать--понятия не имею, нашел какой то урывок из кода:
Случайная величина X, распределенная по экспоненциальному закону распределения с интенсивностью λ, обычно моделируется на компьютере по следующему алгоритму (так называемый алгоритм обратной функции):
а куда его вставлять не знаю(( как начать прогу--тоже((
y = Math.random(); if (y = 0) y = 0.00…1; // с необходимой точностью if (y = 1) y = 0.99…9; X = (-1/О») * Math.log(y);
Решение задачи: «Расчет заработной платы по теореме парето»
textual
Листинг программы
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "FormMain.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TFrmMain *FrmMain; __fastcall TFrmMain::TFrmMain(TComponent* Owner) : TForm(Owner) { } //Функция, возвращающая случайные значения unsigned __int64 NextRandom() { const unsigned __int64 q = 762939453125; const unsigned __int64 M = 4398046511104; static unsigned __int64 m0 = 1; m0 = ((q % M) * (m0 % M))%M; return m0; } //Эта функция вернёт случайное число из заданного диапазона. double GetRandom(double a, double b) { unsigned __int64 Random = NextRandom(); Random = Random % 1000; return ((double(Random)/1000) * (b-a) + a); } //Процедура будет вызвана при появлении формы на экране void __fastcall TFrmMain::FormShow(TObject *Sender) { //Здесь следует произвести расчёт и вывести его результат на экран //Вектор событий int x[120]; memset(x, 0, 120*sizeof(int)); //Текущее событие double Current; //Вспомогательные переменные int i, j; Grid->ColCount = 1; Grid->Cells[0][0] = "[45; 46)"; //Заполним заголовки таблицы for (i = 0; i < 74; i++) { Grid->ColCount++; Grid->Cells[i+1][0] = "[" + IntToStr(i+46) + "; " + IntToStr(i+47) + ")"; if (i == 73) Grid->Cells[i+1][0] = "[" + IntToStr(i+46) + "; " + IntToStr(i+47) + "]"; } //Произведём один миллион экспериментов. const Count = 10000; //Запускаем цикл экспериментов for (i = 0; i < Count; i++) { Current = GetRandom(45, 120); int Cur = int(Current); if (Cur < 0) { Cur = 0; } x[Cur]++; for (j = Cur - 45; j < 75; j++) { int CurCount; if (Grid->Cells[j][1] == "") CurCount = 0; else CurCount = StrToInt(Grid->Cells[j][1]); CurCount++; Grid->Cells[j][1] = StrToInt(CurCount); } } double max = StrToFloat(Grid->Cells[74][1]); for (i = 0; i < 75; i++) { double cur = StrToFloat(Grid->Cells[i][1]); cur /= max; Grid->Cells[i][1] = FloatToStr(cur); } //Теперь функцию распределения следует изобразить на графике. G2->LeftAxis->Automatic = false; G2->LeftAxis->Minimum = -1; G2->LeftAxis->Maximum = 1; for (i = 0; i < 75; i++) { double cur = StrToFloat(Grid->Cells[i][1]); G1->Series[0]->AddXY(i+45, cur); G2->Series[0]->AddXY(i+45, double(x[i+45])/(10000/(120-45))/75); } } //---------------------------------------------------------------------------
Объяснение кода листинга программы
- Объявлены функции
NextRandom()
иGetRandom(double a, double b)
, которые генерируют случайные числа. Первая функция генерирует случайное число, используя две константы -q
иM
, а также статическое значениеm0
. Вторая функция использует результат первой функции, чтобы сгенерировать случайное число в заданном диапазоне. - В функции
FormShow()
создается векторx
размером 120, который будет использоваться для подсчета количества событий в каждом интервале. - Затем создается переменная
Current
, которая будет использоваться для хранения текущего случайного числа. - Далее создается таблица с 75 строками и двумя столбцами. Заголовки столбцов устанавливаются на
[45; 46)
и[45; 47]
. - В цикле, который повторяется один миллион раз, генерируется случайное число и используется для определения интервала, в котором это число находится.
- Если число находится в интервале от 45 до 46, то увеличивается счетчик для этого интервала.
- После завершения цикла, максимальное значение счетчика находится в интервале от 45 до 74, и используется для нормализации всех остальных значений.
- Значения в таблице заменяются на нормализованные значения.
- График создается с помощью двух осей, где ось X представляет интервалы от 45 до 120, а ось Y представляет количество событий.
- В цикле, который повторяется 75 раз, для каждого интервала создается точка на графике. Ось Y для этого интервала нормализуется, чтобы соответствовать оси Y графика.
- Функция
FormShow()
вызывается для отображения формы на экране.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д