LibRan  0.1
Pseudo-random number distribution generator
LRbinom.c
Go to the documentation of this file.
1 
59 /*
60  * Copyright 2019 R.K. Owen, Ph.D.
61  * License see lgpl.md (Gnu Lesser General Public License)
62  */
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
66 
67 #include <math.h>
68 #include "libran.h"
69 
70 /* int */
83  float zero = 0.0, one = 1.0, u, sum = zero, p = one;
84  int i;
85  if (isnan(o->q))
86  o->q = -logf(one - o->p);
87 
88  for (i = 0; i < o->n; i++) {
89  do {
90  u = o->uf(o);
91  } while (u == zero);
92  sum += (-logf(u)/(o->n - i));
93  if (sum > o->q)
94  break;
95  }
96 
97  return i;
98 }
99 
108 float LRi_binomial_PDF(LR_obj *o, int k) {
109  float zero = 0.0, one = 1.0, p = o->p, lp, lq, lt;
110 
111  if (isnan(o->q))
112  o->q = -logf(one - o->p);
113 
114  if (k < 0 || k > o->n) return zero;
115 
116  lp = logf(o->p);
117  lq = - o->q;
118 
119  lt = k*lp + (o->n - k)*lq;
120  lt += (lgammaf(o->n + 1) - lgammaf(k + 1) - lgammaf(o->n - k + 1));
121 
122  return expf(lt);
123 }
124 
133 float LRi_binomial_CDF(LR_obj *o, int k) {
134  float zero = 0.0, one = 1.0, sum = zero, p = o->p, lp, lq, lt;
135 
136  if (isnan(o->q))
137  o->q = -logf(one - o->p);
138 
139  if (k < 0 || k > o->n) return zero;
140 
141  lp = logf(o->p);
142  lq = - o->q;
143 
144  for (int i = 0; i <= k; i++) {
145  lt = i*lp + (o->n - i)*lq;
146  lt += (lgammaf(o->n + 1) - lgammaf(i+1) - lgammaf(o->n - i+1));
147  sum += expf(lt);
148  }
149 
150  return sum;
151 }
152 
153 #ifdef __cplusplus
154 }
155 #endif
int LRi_binomial_RAN(LR_obj *o)
LRi_binomial_RAN(LR_obj *o) - int Binomial distributed variate. Default values: probability of succes...
Definition: LRbinom.c:82
float p
Definition: libran.h:145
float LRi_binomial_PDF(LR_obj *o, int k)
LRi_binomial_PDF(LR_obj *o, int k) - Binomial probablity (or mass) distribution function.
Definition: LRbinom.c:108
float q
Definition: libran.h:146
float(* uf)(LR_obj *)
Definition: libran.h:153
The LibRan common header file.
int n
Definition: libran.h:144
float LRi_binomial_CDF(LR_obj *o, int k)
LRi_binomial_CDF(LR_obj *o, int k) - Binomial distribution cumulative distribution function...
Definition: LRbinom.c:133
the fundamental LibRan random variate distribution object
Definition: libran.h:134