Node:Description, Next:Functions, Up:Usage
The interface has changed dramatically in version 2.0. As more and more generator types were added to this package, a new generic interface was needed. While still plain Ansi C, the architecture is now object-oriented.
All generators are identified by a textual description. This description
is either of the form "type(parameter1,parameter2, ...)"
or is a
shortcut name for a common PRNG as defined in src/prng_def.h
.
Calling prng_new
with such a description as the only argument will
allocate a new generator object, initialize it, and return its handle
(struct prng *
).
All further calls need this handle as the first argument. They are
best explained by example:
#include <prng.h> /* make sure that the compiler can find this file. */ main() { struct prng *g; prng_num seed, n, M; double next, *array; int count; g = prng_new("eicg(2147483647,111,1,0)"); if (g == NULL) /* always check whether prng_new has been successful */ { fprintf(stderr,"Initialisation of generator failed.\n"); exit (-1); } printf("Short name: %s\n",prng_short_name(g)); /* definition as in call to prng_new */ printf("Expanded name: %s\n",prng_long_name(g)); /* Shortcuts expanded */ next = prng_get_next(g); /* get next number 0 <= next < 1 */ prng_get_array(g,array,count); /* fill array with count numbers */ prng_reset(g); /* reset the generator */ prng_free(g); /* deallocate the generator object */ }
These functions work with all generators. For certain generators,
the following functions are available, too:
if (prng_is_congruential(g)) { n = prng_get_next_int(g); /* return next *unscaled* number */ M = prng_get_modulus(g); /* return the modulus of the prng */ } if (prng_can_seed(g)) prng_seed(g,seed); /* reseed the generator */ if (prng_can_fast_sub(g)) puts(prng_get_sub_def(g,20,0)); /* Get subsequence definition */ if (prng_can_fast_con(g)) puts(prng_get_con_def(g,20,1)); /* Get block definition */
NOTE:
prng_new
performs only a rudimentary check on the parameters.
The user is responsible for enforcing all restrictions
on the parameters, such as checking that the modulus of an [E]ICG is
prime, or that LCG and ICG are maximum period generators.
Most of these functions are implemented as macros, so be
careful with autoincrements (++
) in parameters.