GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
ignbin.f
Go to the documentation of this file.
1 INTEGER*4 FUNCTION ignbin(n,pp)
2C**********************************************************************
3C
4C INTEGER*4 FUNCTION IGNBIN( N, PP )
5C
6C GENerate BINomial random deviate
7C
8C
9C Function
10C
11C
12C Generates a single random deviate from a binomial
13C distribution whose number of trials is N and whose
14C probability of an event in each trial is P.
15C
16C
17C Arguments
18C
19C
20C N --> The number of trials in the binomial distribution
21C from which a random deviate is to be generated.
22C INTEGER N
23C JJV (N >= 0)
24C
25C PP --> The probability of an event in each trial of the
26C binomial distribution from which a random deviate
27C is to be generated.
28C REAL PP
29C JJV (0.0 <= pp <= 1.0)
30C
31C IGNBIN <-- A random deviate yielding the number of events
32C from N independent trials, each of which has
33C a probability of event P.
34C INTEGER IGNBIN
35C
36C
37C Note
38C
39C
40C Uses RANF so the value of the seeds, ISEED1 and ISEED2 must be set
41C by a call similar to the following
42C DUM = RANSET( ISEED1, ISEED2 )
43C
44C
45C Method
46C
47C
48C This is algorithm BTPE from:
49C
50C Kachitvichyanukul, V. and Schmeiser, B. W.
51C
52C Binomial Random Variate Generation.
53C Communications of the ACM, 31, 2
54C (February, 1988) 216.
55C
56C**********************************************************************
57C SUBROUTINE BTPEC(N,PP,ISEED,JX)
58C
59C BINOMIAL RANDOM VARIATE GENERATOR
60C MEAN .LT. 30 -- INVERSE CDF
61C MEAN .GE. 30 -- ALGORITHM BTPE: ACCEPTANCE-REJECTION VIA
62C FOUR REGION COMPOSITION. THE FOUR REGIONS ARE A TRIANGLE
63C (SYMMETRIC IN THE CENTER), A PAIR OF PARALLELOGRAMS (ABOVE
64C THE TRIANGLE), AND EXPONENTIAL LEFT AND RIGHT TAILS.
65C
66C BTPE REFERS TO BINOMIAL-TRIANGLE-PARALLELOGRAM-EXPONENTIAL.
67C BTPEC REFERS TO BTPE AND "COMBINED." THUS BTPE IS THE
68C RESEARCH AND BTPEC IS THE IMPLEMENTATION OF A COMPLETE
69C USABLE ALGORITHM.
70C REFERENCE: VORATAS KACHITVICHYANUKUL AND BRUCE SCHMEISER,
71C "BINOMIAL RANDOM VARIATE GENERATION,"
72C COMMUNICATIONS OF THE ACM, FORTHCOMING
73C WRITTEN: SEPTEMBER 1980.
74C LAST REVISED: MAY 1985, JULY 1987
75C REQUIRED SUBPROGRAM: RAND() -- A UNIFORM (0,1) RANDOM NUMBER
76C GENERATOR
77C ARGUMENTS
78C
79C N : NUMBER OF BERNOULLI TRIALS (INPUT)
80C PP : PROBABILITY OF SUCCESS IN EACH TRIAL (INPUT)
81C ISEED: RANDOM NUMBER SEED (INPUT AND OUTPUT)
82C JX: RANDOMLY GENERATED OBSERVATION (OUTPUT)
83C
84C VARIABLES
85C PSAVE: VALUE OF PP FROM THE LAST CALL TO BTPEC
86C NSAVE: VALUE OF N FROM THE LAST CALL TO BTPEC
87C XNP: VALUE OF THE MEAN FROM THE LAST CALL TO BTPEC
88C
89C P: PROBABILITY USED IN THE GENERATION PHASE OF BTPEC
90C FFM: TEMPORARY VARIABLE EQUAL TO XNP + P
91C M: INTEGER VALUE OF THE CURRENT MODE
92C FM: FLOATING POINT VALUE OF THE CURRENT MODE
93C XNPQ: TEMPORARY VARIABLE USED IN SETUP AND SQUEEZING STEPS
94C P1: AREA OF THE TRIANGLE
95C C: HEIGHT OF THE PARALLELOGRAMS
96C XM: CENTER OF THE TRIANGLE
97C XL: LEFT END OF THE TRIANGLE
98C XR: RIGHT END OF THE TRIANGLE
99C AL: TEMPORARY VARIABLE
100C XLL: RATE FOR THE LEFT EXPONENTIAL TAIL
101C XLR: RATE FOR THE RIGHT EXPONENTIAL TAIL
102C P2: AREA OF THE PARALLELOGRAMS
103C P3: AREA OF THE LEFT EXPONENTIAL TAIL
104C P4: AREA OF THE RIGHT EXPONENTIAL TAIL
105C U: A U(0,P4) RANDOM VARIATE USED FIRST TO SELECT ONE OF THE
106C FOUR REGIONS AND THEN CONDITIONALLY TO GENERATE A VALUE
107C FROM THE REGION
108C V: A U(0,1) RANDOM NUMBER USED TO GENERATE THE RANDOM VALUE
109C (REGION 1) OR TRANSFORMED INTO THE VARIATE TO ACCEPT OR
110C REJECT THE CANDIDATE VALUE
111C IX: INTEGER CANDIDATE VALUE
112C X: PRELIMINARY CONTINUOUS CANDIDATE VALUE IN REGION 2 LOGIC
113C AND A FLOATING POINT IX IN THE ACCEPT/REJECT LOGIC
114C K: ABSOLUTE VALUE OF (IX-M)
115C F: THE HEIGHT OF THE SCALED DENSITY FUNCTION USED IN THE
116C ACCEPT/REJECT DECISION WHEN BOTH M AND IX ARE SMALL
117C ALSO USED IN THE INVERSE TRANSFORMATION
118C R: THE RATIO P/Q
119C G: CONSTANT USED IN CALCULATION OF PROBABILITY
120C MP: MODE PLUS ONE, THE LOWER INDEX FOR EXPLICIT CALCULATION
121C OF F WHEN IX IS GREATER THAN M
122C IX1: CANDIDATE VALUE PLUS ONE, THE LOWER INDEX FOR EXPLICIT
123C CALCULATION OF F WHEN IX IS LESS THAN M
124C I: INDEX FOR EXPLICIT CALCULATION OF F FOR BTPE
125C AMAXP: MAXIMUM ERROR OF THE LOGARITHM OF NORMAL BOUND
126C YNORM: LOGARITHM OF NORMAL BOUND
127C ALV: NATURAL LOGARITHM OF THE ACCEPT/REJECT VARIATE V
128C
129C X1,F1,Z,W,Z2,X2,F2, AND W2 ARE TEMPORARY VARIABLES TO BE
130C USED IN THE FINAL ACCEPT/REJECT TEST
131C
132C QN: PROBABILITY OF NO SUCCESS IN N TRIALS
133C
134C REMARK
135C IX AND JX COULD LOGICALLY BE THE SAME VARIABLE, WHICH WOULD
136C SAVE A MEMORY POSITION AND A LINE OF CODE. HOWEVER, SOME
137C COMPILERS (E.G.,CDC MNF) OPTIMIZE BETTER WHEN THE ARGUMENTS
138C ARE NOT INVOLVED.
139C
140C ISEED NEEDS TO BE DOUBLE PRECISION IF THE IMSL ROUTINE
141C GGUBFS IS USED TO GENERATE UNIFORM RANDOM NUMBER, OTHERWISE
142C TYPE OF ISEED SHOULD BE DICTATED BY THE UNIFORM GENERATOR
143C
144C**********************************************************************
145
146C
147C
148C
149C*****DETERMINE APPROPRIATE ALGORITHM AND WHETHER SETUP IS NECESSARY
150C
151C ..
152C .. Scalar Arguments ..
153 REAL pp
154 INTEGER*4 n
155C ..
156C .. Local Scalars ..
157 REAL al,alv,amaxp,c,f,f1,f2,ffm,fm,g,p,p1,p2,p3,p4,psave,q,qn,r,u,
158 + v,w,w2,x,x1,x2,xl,xll,xlr,xm,xnp,xnpq,xr,ynorm,z,z2
159 INTEGER*4 i,ix,ix1,k,m,mp,nsave
160C ..
161C .. External Functions ..
162 REAL ranf
163 EXTERNAL ranf
164C ..
165C .. Intrinsic Functions ..
166 INTRINSIC abs,alog,amin1,iabs,int,sqrt
167C JJV ..
168C JJV .. Save statement ..
169 SAVE p,q,m,fm,xnp,xnpq,p1,xm,xl,xr,c,xll,xlr,p2,p3,p4,qn,r,g,
170 + psave,nsave
171C JJV I am including the variables in data statements
172C ..
173C .. Data statements ..
174C JJV made these ridiculous starting values - the hope is that
175C JJV no one will call this the first time with them as args
176 DATA psave,nsave/-1.0e37,-214748365/
177C ..
178C .. Executable Statements ..
179 IF (pp.NE.psave) GO TO 10
180 IF (n.NE.nsave) GO TO 20
181 IF (xnp-30.0.LT.0.0) GO TO 150
182 GO TO 30
183C
184C*****SETUP, PERFORM ONLY WHEN PARAMETERS CHANGE
185C
186
187C JJV added the argument checker - involved only renaming 10
188C JJV and 20 to the checkers and adding checkers
189C JJV Only remaining problem - if called initially with the
190C JJV initial values of psave and nsave, it will hang
191 10 IF (pp.LT.0.0) CALL xstopx ('PP < 0.0 in IGNBIN - ABORT!')
192 IF (pp.GT.1.0) CALL xstopx ('PP > 1.0 in IGNBIN - ABORT!')
193 psave = pp
194 p = amin1(psave,1.-psave)
195 q = 1. - p
196 20 IF (n.LT.0) CALL xstopx ('N < 0 in IGNBIN - ABORT!')
197 xnp = n*p
198 nsave = n
199 IF (xnp.LT.30.) GO TO 140
200 ffm = xnp + p
201 m = ffm
202 fm = m
203 xnpq = xnp*q
204 p1 = int(2.195*sqrt(xnpq)-4.6*q) + 0.5
205 xm = fm + 0.5
206 xl = xm - p1
207 xr = xm + p1
208 c = 0.134 + 20.5/ (15.3+fm)
209 al = (ffm-xl)/ (ffm-xl*p)
210 xll = al* (1.+.5*al)
211 al = (xr-ffm)/ (xr*q)
212 xlr = al* (1.+.5*al)
213 p2 = p1* (1.+c+c)
214 p3 = p2 + c/xll
215 p4 = p3 + c/xlr
216C WRITE(6,100) N,P,P1,P2,P3,P4,XL,XR,XM,FM
217C 100 FORMAT(I15,4F18.7/5F18.7)
218C
219C*****GENERATE VARIATE
220C
221 30 u = ranf()*p4
222 v = ranf()
223C
224C TRIANGULAR REGION
225C
226 IF (u.GT.p1) GO TO 40
227 ix = xm - p1*v + u
228 GO TO 170
229C
230C PARALLELOGRAM REGION
231C
232 40 IF (u.GT.p2) GO TO 50
233 x = xl + (u-p1)/c
234 v = v*c + 1. - abs(xm-x)/p1
235 IF (v.GT.1. .OR. v.LE.0.) GO TO 30
236 ix = x
237 GO TO 70
238C
239C LEFT TAIL
240C
241 50 IF (u.GT.p3) GO TO 60
242 ix = xl + alog(v)/xll
243 IF (ix.LT.0) GO TO 30
244 v = v* (u-p2)*xll
245 GO TO 70
246C
247C RIGHT TAIL
248C
249 60 ix = xr - alog(v)/xlr
250 IF (ix.GT.n) GO TO 30
251 v = v* (u-p3)*xlr
252C
253C*****DETERMINE APPROPRIATE WAY TO PERFORM ACCEPT/REJECT TEST
254C
255 70 k = iabs(ix-m)
256 IF (k.GT.20 .AND. k.LT.xnpq/2-1) GO TO 130
257C
258C EXPLICIT EVALUATION
259C
260 f = 1.0
261 r = p/q
262 g = (n+1)*r
263 IF (m-ix.LT.0) GO TO 80
264 IF (m-ix.EQ.0) GO TO 120
265 GO TO 100
266 80 mp = m + 1
267 DO 90 i = mp,ix
268 f = f* (g/i-r)
269 90 CONTINUE
270 GO TO 120
271
272 100 ix1 = ix + 1
273 DO 110 i = ix1,m
274 f = f/ (g/i-r)
275 110 CONTINUE
276 120 IF (v-f.LE.0) GO TO 170
277 GO TO 30
278C
279C SQUEEZING USING UPPER AND LOWER BOUNDS ON ALOG(F(X))
280C
281 130 amaxp = (k/xnpq)* ((k* (k/3.+.625)+.1666666666666)/xnpq+.5)
282 ynorm = -k*k/ (2.*xnpq)
283 alv = alog(v)
284 IF (alv.LT.ynorm-amaxp) GO TO 170
285 IF (alv.GT.ynorm+amaxp) GO TO 30
286C
287C STIRLING'S FORMULA TO MACHINE ACCURACY FOR
288C THE FINAL ACCEPTANCE/REJECTION TEST
289C
290 x1 = ix + 1
291 f1 = fm + 1.
292 z = n + 1 - fm
293 w = n - ix + 1.
294 z2 = z*z
295 x2 = x1*x1
296 f2 = f1*f1
297 w2 = w*w
298 IF (alv- (xm*alog(f1/x1)+ (n-m+.5)*alog(z/w)+ (ix-
299 + m)*alog(w*p/ (x1*q))+ (13860.- (462.- (132.- (99.-
300 + 140./f2)/f2)/f2)/f2)/f1/166320.+ (13860.- (462.- (132.- (99.-
301 + 140./z2)/z2)/z2)/z2)/z/166320.+ (13860.- (462.- (132.- (99.-
302 + 140./x2)/x2)/x2)/x2)/x1/166320.+ (13860.- (462.- (132.- (99.-
303 + 140./w2)/w2)/w2)/w2)/w/166320.) .LE. 0.) GO TO 170
304 GO TO 30
305C
306C INVERSE CDF LOGIC FOR MEAN LESS THAN 30
307C
308 140 qn = q**n
309 r = p/q
310 g = r* (n+1)
311 150 ix = 0
312 f = qn
313 u = ranf()
314 160 IF (u.LT.f) GO TO 170
315 IF (ix.GT.110) GO TO 150
316 u = u - f
317 ix = ix + 1
318 f = f* (g/ix-r)
319 GO TO 160
320
321 170 IF (psave.GT.0.5) ix = n - ix
322 ignbin = ix
323 RETURN
324
325 END
integer *4 function ignbin(n, pp)
Definition ignbin.f:2
real function ranf()
Definition ranf.f:2