Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include "fvar.hpp"
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00037 double randpoisson(double xm, const random_number_generator& rng)
00038 {
00039 double gammln(double xx);
00040 static double sq,alxm,g,oldm=(-1.0);
00041
00042 double em,t,y;
00043
00044 if (xm < 12.0) {
00045 if (xm != oldm) {
00046 oldm=xm;
00047 g=exp(-xm);
00048 }
00049 em = -1;
00050 t=1.0;
00051 do {
00052 ++em;
00053
00054 t*= y=((random_number_generator&) rng).better_rand();
00055 } while (t > g);
00056 } else {
00057 if (xm != oldm) {
00058 oldm=xm;
00059 sq=sqrt(2.0*xm);
00060 alxm=log(xm);
00061 g=xm*alxm-gammln(xm+1.0);
00062 }
00063 do {
00064 do {
00065
00066 y=tan(PI*((random_number_generator&) rng).better_rand());
00067 em=sq*y+xm;
00068 } while (em < 0.0);
00069 em=floor(em);
00070 t=0.9*(1.0+y*y)*exp(em*alxm-gammln(em+1.0)-g);
00071 } while (((random_number_generator&) rng).better_rand() > t);
00072
00073 }
00074 return em;
00075 }
00076 #undef PI
00077
00085 void dvector::fill_randpoisson(double lambda,
00086 const random_number_generator& rng)
00087 {
00088 for (int i=indexmin(); i<=indexmax(); i++)
00089 {
00090 elem(i)=randpoisson(lambda,rng);
00091 }
00092 }