comparison libcruft/ranlib/Basegen.doc @ 2330:12ff450cbb1f

[project @ 1996-07-19 01:39:22 by jwe] Initial revision
author jwe
date Fri, 19 Jul 1996 01:49:31 +0000
parents
children df7c57a6639d
comparison
equal deleted inserted replaced
2329:30c606bec7a8 2330:12ff450cbb1f
1
2
3
4
5
6
7
8
9
10
11
12 RANLIB
13
14 Library of Fortran Routines for Random Number Generation
15
16
17
18
19
20
21
22
23 Base Generator Documentation
24
25
26
27
28
29
30
31
32 Compiled and Written by:
33
34 Barry W. Brown
35 James Lovato
36
37
38
39
40
41
42
43
44
45
46 Department of Biomathematics, Box 237
47 The University of Texas, M.D. Anderson Cancer Center
48 1515 Holcombe Boulevard
49 Houston, TX 77030
50
51
52 This work was supported by grant CA-16672 from the National Cancer Institute.
53
54
55
56
57 Base Random Number Generator
58
59
60
61 I. OVERVIEW AND DEFAULT BEHAVIOR
62
63 This set of programs contains 32 virtual random number generators.
64 Each generator can provide 1,048,576 blocks of numbers, and each block
65 is of length 1,073,741,824. Any generator can be set to the beginning
66 or end of the current block or to its starting value. The methods are
67 from the paper cited immediately below, and most of the code is a
68 transliteration from the Pascal of the paper into Fortran.
69
70 P. L'Ecuyer and S. Cote. Implementing a Random Number Package with
71 Splitting Facilities. ACM Transactions on Mathematical Software 17:1,
72 pp 98-111.
73
74 Most users won't need the sophisticated capabilities of this package,
75 and will desire a single generator. This single generator (which will
76 have a non-repeating length of 2.3 X 10^18 numbers) is the default.
77 In order to accommodate this use, the concept of the current generator
78 is added to those of the cited paper; references to a generator are
79 always to the current generator. The current generator is initially
80 generator number 1; it can be changed by SETCGN, and the ordinal
81 number of the current generator can be obtained from GETCGN.
82
83 The user of the default can set the initial values of the two integer
84 seeds with SETALL. If the user does not set the seeds, the random
85 number generation will use the default values, 1234567890 and
86 123456789. The values of the current seeds can be achieved by a call
87 to GETSD. Random number may be obtained as integers ranging from 1 to
88 a large integer by reference to function IGNLGI or as a floating point
89 number between 0 and 1 by a reference to function RANF. These are the
90 only routines needed by a user desiring a single stream of random
91 numbers.
92
93 II. CONCEPTS
94
95 A stream of pseudo-random numbers is a sequence, each member of which
96 can be obtained either as an integer in the range 1..2,147,483,563 or
97 as a floating point number in the range [0..1]. The user is in charge
98 of which representation is desired.
99
100 The method contains an algorithm for generating a stream with a very
101 long period, 2.3 X 10^18. This stream in partitioned into G (=32)
102 virtual generators. Each virtual generator contains 2^20 (=1,048,576)
103 blocks of non-overlapping random numbers. Each block is 2^30
104 (=1,073,741,824) in length.
105
106
107
108 Base Random Number Generator Page 2
109
110
111 The state of a generator is determined by two integers called seeds.
112 The seeds can be initialized by the user; the initial values of the
113 first must lie between 1 and 2,147,483,562, that of the second between
114 1 and 2,147,483,398. Each time a number is generated, the values of
115 the seeds change. Three values of seeds are remembered by the
116 generators at all times: the value with which the generator was
117 initialized, the value at the beginning of the current block, and the
118 value at the beginning of the next block. The seeds of any generator
119 can be set to any of these three values at any time.
120
121 Of the 32 virtual generators, exactly one will be the current
122 generator, i.e., that one will be used to generate values for IGNLGI
123 and RANDF. Initially, the current generator is set to number one.
124 The current generator may be changed by calling SETCGN, and the number
125 of the current generator can be obtained using GETCGN.
126
127 III. AN EXAMPLE
128
129 An example of the need for these capabilities is as follows. Two
130 statistical techniques are being compared on data of different sizes.
131 The first technique uses bootstrapping and is thought to be as
132 accurate using less data than the second method which employs only
133 brute force.
134
135 For the first method, a data set of size uniformly distributed between
136 25 and 50 will be generated. Then the data set of the specified size
137 will be generated and alalyzed. The second method will choose a data
138 set size between 100 and 200, generate the data and alalyze it. This
139 process will be repeated 1000 times.
140
141 For variance reduction, we want the random numbers used in the two
142 methods to be the same for each of the 1000 comparisons. But method
143 two will use more random numbers than method one and without this
144 package, synchronization might be difficult.
145
146 With the package, it is a snap. Use generator 1 to obtain the sample
147 size for method one and generator 2 to obtain the data. Then reset
148 the state to the beginning of the current block and do the same for
149 the second method. This assures that the initial data for method two
150 is that used by method one. When both have concluded, advance the
151 block for both generators.
152
153 IV. THE INTERFACE
154
155 A random number is obtained either as a random integer between 1 and
156 2,147,483,562 by invoking integer function IGNLGI (I GeNerate LarGe
157 Integer) or as a random floating point number between 0 and 1 by
158 invoking real function RANF. Neither function has arguments.
159
160 The seed of the first generator can be set by invoking subroutine
161 SETALL; the values of the seeds of the other 31 generators are
162 calculated from this value.
163
164
165
166 Base Random Number Generator Page 3
167
168
169 The number of the current generator can be set by calling subroutine
170 SETCGN, which takes a single argument, the integer generator number in
171 the range 1..32. The number of the current generator can be obtained
172 by invoking subroutine GETCGN which returns the number in its single
173 integer argument.
174
175
176 V. CALLING SEQUENCES
177
178 A. SETTING THE SEED OF ALL GENERATORS
179
180 C**********************************************************************
181 C
182 C SUBROUTINE SETALL(ISEED1,ISEED2)
183 C SET ALL random number generators
184 C
185 C Sets the initial seed of generator 1 to ISEED1 and ISEED2. The
186 C initial seeds of the other generators are set accordingly, and
187 C all generators states are set to these seeds.
188 C
189 C Arguments
190 C
191 C
192 C ISEED1 -> First of two integer seeds
193 C INTEGER ISEED1
194 C
195 C ISEED2 -> Second of two integer seeds
196 C INTEGER ISEED1
197 C
198 C**********************************************************************
199
200
201 B. OBTAINING RANDOM NUMBERS
202
203 C**********************************************************************
204 C
205 C INTEGER FUNCTION IGNLGI()
206 C GeNerate LarGe Integer
207 C
208 C Returns a random integer following a uniform distribution over
209 C (1, 2147483562) using the current generator.
210 C
211 C**********************************************************************
212
213 C**********************************************************************
214 C
215 C REAL FUNCTION RANF()
216 C RANDom number generator as a Function
217 C
218 C Returns a random floating point number from a uniform distribution
219 C over 0 - 1 (endpoints of this interval are not returned) using the
220 C current generator
221 C
222 C**********************************************************************
223
224
225
226 Base Random Number Generator Page 4
227
228
229 C. SETTING AND OBTAINING THE NUMBER OF THE CURRENT GENERATOR
230
231 C**********************************************************************
232 C
233 C SUBROUTINE SETCGN( G )
234 C Set GeNerator
235 C
236 C Sets the current generator to G. All references to a generator
237 C are to the current generator.
238 C
239 C Arguments
240 C
241 C G --> Number of the current random number generator (1..32)
242 C INTEGER G
243 C
244 C**********************************************************************
245
246 C**********************************************************************
247 C
248 C SUBROUTINE GETCGN(G)
249 C Get GeNerator
250 C
251 C Returns in G the number of the current random number generator
252 C
253 C Arguments
254 C
255 C G <-- Number of the current random number generator (1..32)
256 C INTEGER G
257 C
258 C**********************************************************************
259
260 D. OBTAINING OR CHANGING SEEDS IN CURRENT GENERATOR
261
262 C**********************************************************************
263 C
264 C SUBROUTINE ADVNST(K)
265 C ADV-a-N-ce ST-ate
266 C
267 C Advances the state of the current generator by 2^K values and
268 C resets the initial seed to that value.
269 C
270 C Arguments
271 C
272 C
273 C K -> The generator is advanced by 2^K values
274 C INTEGER K
275 C
276 C**********************************************************************
277
278
279
280 Base Random Number Generator Page 5
281
282
283 C**********************************************************************
284 C
285 C SUBROUTINE GETSD(ISEED1,ISEED2)
286 C GET SeeD
287 C
288 C Returns the value of two integer seeds of the current generator
289 C
290 C Arguments
291 C
292 C
293 C
294 C ISEED1 <- First integer seed of generator G
295 C INTEGER ISEED1
296 C
297 C ISEED2 <- Second integer seed of generator G
298 C INTEGER ISEED1
299 C
300 C**********************************************************************
301
302 C**********************************************************************
303 C
304 C SUBROUTINE INITGN(ISDTYP)
305 C INIT-ialize current G-e-N-erator
306 C
307 C Reinitializes the state of the current generator
308 C
309 C Arguments
310 C
311 C
312 C ISDTYP -> The state to which the generator is to be set
313 C ISDTYP = -1 => sets the seeds to their initial value
314 C ISDTYP = 0 => sets the seeds to the first value of
315 C the current block
316 C ISDTYP = 1 => sets the seeds to the first value of
317 C the next block
318 C
319 C INTEGER ISDTYP
320 C
321 C**********************************************************************
322
323 C**********************************************************************
324 C
325 C SUBROUTINE SETSD(ISEED1,ISEED2)
326 C SET S-ee-D of current generator
327 C
328 C Resets the initial seed of the current generator to ISEED1 and
329 C ISEED2. The seeds of the other generators remain unchanged.
330 C
331 C Arguments
332 C
333 C
334 C ISEED1 -> First integer seed
335 C INTEGER ISEED1
336 C
337 C ISEED2 -> Second integer seed
338 C INTEGER ISEED1
339 C
340 C**********************************************************************
341
342
343
344 Base Random Number Generator Page 6
345
346
347 E. MISCELLANY
348
349 C**********************************************************************
350 C
351 C INTEGER FUNCTION MLTMOD(A,S,M)
352 C
353 C Returns (A*S) MOD M
354 C
355 C Arguments
356 C
357 C
358 C A, S, M -->
359 C INTEGER A,S,M
360 C
361 C**********************************************************************
362
363 C**********************************************************************
364 C
365 C SUBROUTINE SETANT(QVALUE)
366 C SET ANTithetic
367 C
368 C Sets whether the current generator produces antithetic values. If
369 C X is the value normally returned from a uniform [0,1] random
370 C number generator then 1 - X is the antithetic value. If X is the
371 C value normally returned from a uniform [0,N] random number
372 C generator then N - 1 - X is the antithetic value.
373 C
374 C All generators are initialized to NOT generate antithetic values.
375 C
376 C Arguments
377 C
378 C QVALUE -> .TRUE. if generator G is to generating antithetic
379 C values, otherwise .FALSE.
380 C LOGICAL QVALUE
381 C
382 C**********************************************************************