Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2013, 23:05   #1
hp114frost
 
Регистрация: 13.10.2013
Сообщений: 6
Лампочка распределение пуассона на c++

Добрый день! Думаю данный вопрос будет интересен не только начинающим, но и программистам хорошего уровня.

Собственно моя задача: мне необходимо написать функцию распределения Пуассона, полностью аналогичную функции poissrnd() в Matlab. Написать из псевдокода не получается, книгу Кнут(а), смотрел, не удается написать, и там похоже не то распределение. Искал и перерыл тысячи иностранных и русских источников, но не нашел ничего подходящего, ни одной функции, которая принимала бы на вход два значения - М и lambda.

Помогите пожалуйста, моих знаний не хватает на написание такой функции.
Пишу в Dev c++, просьба расписать, как подключать необходимые библиотеки, если это будет необходимо для решения задачи, и где их брать (конкретно именно этой задачи, так я более-менее ориентируюсь в среде разработки Dev c++).

Очень прошу помощи и скорейшего ответа, помогите начинающему.
hp114frost вне форума Ответить с цитированием
Старый 13.10.2013, 23:12   #2
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

просто подставьте свои значения
лямбда = n*p;
само распределение
k - количество успехов
((лямбда^k)*(e^(-лямбда)))/k!;
для начала вам нужно написать функцию факториал
Код:
float  __cdecl Factorial(float n)
	{ float k = 1;
	 float i = 0;
	 for (i = 0;i<n;i++){
	  k*=(n-i);
	}
	
	return k;
}
потом просто подставить в формулу и зациклить
proef вне форума Ответить с цитированием
Старый 13.10.2013, 23:15   #3
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

да и что такое M у вас?
proef вне форума Ответить с цитированием
Старый 13.10.2013, 23:31   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Да, у распределения Пуассона - 1 параметр.
Наверное, M - сама случайная величина.
type_Oleg вне форума Ответить с цитированием
Старый 15.10.2013, 12:03   #5
hp114frost
 
Регистрация: 13.10.2013
Сообщений: 6
По умолчанию

что касаемо m - , простите, вызывать надо от одного значения - lambda.
получился следующий код, который выводит некорректный результат, где я ошибся? При написании полностью скопировал код факториала, предложенный выше, он выдает корректные результаты и работает идеально, большое спасибо.

float factor(float n)
{
float k = 1;
float i = 0;
for (i = 0;i<n;i++){
k*=(n-i);
}
return k;
}


void pouss()
{
int lambda = 4;
float rrr;//итог
int kfact;//факториал к
int k=4;//количество испытаний
kfact=int(factor(k));//вычисление факториала
//printf(" %d ",k);
rrr=((pow(lambda,k))*(pow(M_E,-lambda)))/kfact;
printf("\n");
printf("%d",rrr);
printf("\n");
}
hp114frost вне форума Ответить с цитированием
Старый 15.10.2013, 12:32   #6
JIeIIIa
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 54
По умолчанию

Инициализации M_E не вижу. Ну и говорите на каких данных результат не корректный.

пс: а вообще коль нужна функция, так и делайте ее как функцию float pouss(int lambda)
JIeIIIa вне форума Ответить с цитированием
Старый 15.10.2013, 12:50   #7
hp114frost
 
Регистрация: 13.10.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от JIeIIIa Посмотреть сообщение
Инициализации M_E не вижу. Ну и говорите на каких данных результат не корректный.

пс: а вообще коль нужна функция, так и делайте ее как функцию float pouss(int lambda)
Зачем инициализировать? это встроенная в библиотеку math.h функция получения числа Е.
Пока это просто тестовая функция, компонент большой программы, в функцию будут передаваться значения по циклу, я переделаю ее, как вы привели выше, согласен, однако на данный момент мне важно написание самого алгоритма.

Данные, на которых результат не корректный приведены в программе - при lambda равное 4, или любому другому числу, результат отрицательный при выводе %d или в данном случае, как в программе выводится 0.19..., это тоже абсурд, должно получаться целое значение по типу 4 или 7 или 9. Ошибка видимо в самой структуре формулы, не могу понять.
hp114frost вне форума Ответить с цитированием
Старый 15.10.2013, 13:00   #8
hp114frost
 
Регистрация: 13.10.2013
Сообщений: 6
По умолчанию

еще вопрос к знатокам, в матлабе poissrnd() вычисляет что-то случайное. В первом ответе мне я не вижу случайности, все работает по циклу, без случайных значений.
Как с этим быть? могу привести код функции в matlab.
Очень прошу помощи.
hp114frost вне форума Ответить с цитированием
Старый 15.10.2013, 17:53   #9
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Цитата :
R = poissrnd(LAMBDA) функция предназначена для генерации псевдослучайного числа по распределению Пуассона для каждого значения параметра LAMBDA.
А вы делаете совсем не то. Вы просто вычисляете вероятность rrr уже заданного случайного числа k.

PS Например, в C++ есть генератор псевдослучайных чисел rand() , но он для равномерно распределенных, а не для Пуассона.

Последний раз редактировалось type_Oleg; 15.10.2013 в 18:01.
type_Oleg вне форума Ответить с цитированием
Старый 15.10.2013, 18:40   #10
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Вот, из книги Вадзинский Р.Н. «Справочник по вероятностным распределениям». СПб, Наука, 2001
Мю - это лямбда.
rand - стандартно равномерно распределенное случайное число. То есть от 0 до 1, а не так как в Си.
Два варианта вычислений:
Изображения
Тип файла: jpg Poison.jpg (19.5 Кб, 266 просмотров)
type_Oleg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение уравнения Пуассона. MathCAD Ridiel Помощь студентам 0 19.05.2010 22:28
пуассоновское распределение Dafka Помощь студентам 0 30.03.2010 21:15
Необходимо получить случайную величину типа Double, распределенную по функции Пуассона! SkAndrew Помощь студентам 3 04.01.2010 08:45