mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-26 02:20:20 -04:00 
			
		
		
		
	git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6437 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			307 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			HTML
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			HTML
		
	
	
		
			Executable File
		
	
	
	
	
| <HTML><HEAD>
 | |
| 
 | |
| <TITLE> Random Variate Generation Routines </TITLE>
 | |
| 
 | |
| </HEAD><BODY>
 | |
| 
 | |
| 
 | |
| <H1> Random Variate Generation Routines </H1>
 | |
| 
 | |
| <P>This module provides facilities for basic pseudo-random number generation,
 | |
| and for generation of random variates from various common distributions.
 | |
| 
 | |
| <P>All the random generation procedures use the same underlying
 | |
| "stream" of random numbers.  This stream is generated using the
 | |
| <TT>nrand48</TT> pseudo-random generation procedure found on most Unix
 | |
| systems, with the output being combined with a limited supply of real
 | |
| random numbers from the file "randfile" in the source
 | |
| directory for this software, in order to reduce the chances that the
 | |
| pseudo-random numbers aren't random enough.
 | |
| 
 | |
| <P>A pseudo-random number stream is determined by an integer
 | |
| <I>seed</I>, which is typically set by the user for each experimental
 | |
| run (eg, to 1, 2, 3, etc. for successive runs).  The state of the
 | |
| random number stream can be saved in a structure of type
 | |
| <TT>rand_state</TT>, and later restored.  For example, the state could
 | |
| be saved in a file at the end of a run, and restored if it is later
 | |
| decided that the run should be continued for longer.
 | |
| 
 | |
| <P>The methods for generating random variates from various distributions
 | |
| are mostly taken from the following reference:
 | |
| <BLOCKQUOTE> 
 | |
|   Devroye, L. (1986) <I>Non-Uniform Random Variate Generation</I>, 
 | |
|   New York: Springer-Verlag.
 | |
| </BLOCKQUOTE>
 | |
| The methods used here are not necessarily the fastest available.  They were
 | |
| selected to be reasonably fast while also being easy to write.
 | |
| 
 | |
| <P><B>Header file required</B>: <TT>rand.h</TT>
 | |
| 
 | |
| 
 | |
| <A NAME="get-set-sec">
 | |
| <P><HR>
 | |
| <CENTER><BIG>Setting and saving the state</BIG></CENTER>
 | |
| </A>
 | |
| 
 | |
| 
 | |
| <A NAME="seed"><HR><B>rand_seed</B>: 
 | |
| Set the state from an integer seed.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| void rand_seed
 | |
| ( int seed;  /* Seed to set state based on */
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
|   
 | |
| <P>Sets the random number generator to a state that is determined from
 | |
| the integer <TT>seed</TT>.  Setting the seed the same on two occasions,
 | |
| and then calling exactly the same sequence of random generation
 | |
| procedures, should produce exactly the same sequence of random
 | |
| variates.  (Note: this may not be true, however, if computers with
 | |
| different architectures are used on the two occasions.)
 | |
| 
 | |
| <P>Sequential seeds should produce streams that are pretty much
 | |
| independent (unlike the situation for some pseudo-random number
 | |
| generators).  Setting the seed randomly according to the time or day,
 | |
| or some such, without recording what it was, is <B>not</B>
 | |
| recommended, since the results are then not reproducible.
 | |
| 
 | |
| <P><A NAME="get_state"><HR><B>rand_get_state</B>: 
 | |
| Get a pointer to the current state.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| rand_state *rand_get_state (void)
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| Returns a pointer to the current state of the random number generator,
 | |
| which is a structure of type <TT>rand_state</TT>.  The only use for this
 | |
| pointer is to use it to save a copy of the current state someplace.
 | |
| 
 | |
| 
 | |
| <P><A NAME="use_state"><HR><B>rand_use_state</B>: 
 | |
| Set the state to use from now on.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| void rand_use_state 
 | |
| ( rand_state *state  /* Pointer to a previously saved state */
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| Sets the random number generator to the state pointed to by the argument.
 | |
| This state must be valid.  The only way to get a valid state is by using
 | |
| <TT>rand_get_state</TT>.
 | |
| 
 | |
| 
 | |
| <A NAME="uniform-sec">
 | |
| <P><HR>
 | |
| <CENTER><BIG>Generating uniform random variates</BIG></CENTER>
 | |
| </A>
 | |
| 
 | |
| 
 | |
| <A NAME="uniform"><HR><B>rand_uniform</B>: 
 | |
| Generate uniformly from [0,1).</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| double rand_uniform (void)
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| Returns a random number that is uniformly distributed between 0 and 1,
 | |
| with a value of exactly 0 being possible, but with a value of exactly 1
 | |
| not being possible.
 | |
| 
 | |
| <P><A NAME="uniopen"><HR><B>rand_uniopen</B>: 
 | |
| Generate uniformly from (0,1).</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| double rand_uniopen (void)
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| Returns a random number that is uniformly distributed between 0 and 1,
 | |
| with neither a value of exactly 0 nor a value of exactly 1
 | |
| being possible.
 | |
| 
 | |
| 
 | |
| <A NAME="discrete-sec">
 | |
| <P><HR>
 | |
| <CENTER><BIG>Generating discrete random variates</BIG></CENTER>
 | |
| </A>
 | |
| 
 | |
| 
 | |
| <A NAME="int"><HR><B>rand_int</B>: 
 | |
| Pick an integer uniformly from <I>0</I> to <I>n-1</I>.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| int rand_int 
 | |
| ( int n  /* Number of integers (from 0) to pick from */
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Randomly picks an integer from the set { <TT>0, 1, ..., n-1</TT> },
 | |
| with each integer being equally probable.  The probabilities may
 | |
| become somewhat unequal, however, if <TT>n</TT> is very large,
 | |
| approaching 2<SUP><SMALL>31</SMALL></SUP>.
 | |
| 
 | |
| 
 | |
| <P><A NAME="pickd"><HR><B>rand_pickd</B>: Pick an integer from <I>0</I>
 | |
| to <I>n-1</I> with given probabilities (as doubles).</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| int rand_pickd
 | |
| ( double *p,  /* Array of probabilities, of length n */
 | |
|   int n       /* Number of integers (from 0) to pick from */
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Randomly picks an integer from the set { <TT>0, 1, ..., n-1</TT> },
 | |
| with probabilities given by the array of double-precision numbers
 | |
| passed as the first argument.  These numbers need not sum to one, but they
 | |
| must be non-negative, and must not all be zero.  The actual
 | |
| probabilities used are obtained by dividing each number in this array
 | |
| by the sum of all the numbers.  
 | |
| 
 | |
| <P>If one of the probabilities is exactly zero, it is guaranteed that
 | |
| the corresponding integer will not be picked.
 | |
| 
 | |
| 
 | |
| <P><A NAME="pickf"><HR><B>rand_pickf</B>: Pick an integer from <I>0</I>
 | |
| to <I>n-1</I> with given probabilities (as floats).</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| int rand_pickf
 | |
| ( float *p,  /* Array of probabilities, of length n */
 | |
|   int n      /* Number of integers (from 0) to pick from */
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>This procedure is the same as <A HREF="#pickd"><TT>rand_pickd</TT></A>
 | |
| except that the array giving the probabilities is an array of single-precision
 | |
| floating point numbers, rather than double-precision.
 | |
| 
 | |
| 
 | |
| <A NAME="poisson"><HR><B>rand_poisson</B>: 
 | |
| Generate a non-negative integer from a Poisson distribution.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| int rand_poisson
 | |
| ( double lambda  /* Mean of the Poisson distribution */
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Generates a non-negative integer from the Poisson distribution with mean 
 | |
| <tt>lambda</tt>.
 | |
| 
 | |
| 
 | |
| <P><A NAME="permutation"><HR><B>rand_permutation</B>: Generate a random
 | |
| permutation of integers from <i>1</i> to <i>n</i>.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| int rand_permutation
 | |
| ( int *perm,  /* Place to store the permutation */
 | |
|   int n       /* Number of integers to permute */
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Stores a random permutation of the integers from <i>1</i> to <i>n</i> in the
 | |
| array perm, which must be at least <i>n</i> long.  All permutations are
 | |
| equally likely.
 | |
| 
 | |
| 
 | |
| <A NAME="continuous-sec">
 | |
| <P><HR>
 | |
| <CENTER><BIG>Generating continuous random variates</BIG></CENTER>
 | |
| </A>
 | |
| 
 | |
| 
 | |
| <A NAME="gaussian"><HR><B>rand_gaussian</B>: 
 | |
| Generate a standard Gaussian (normal) random variate.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| double rand_gaussian (void)
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Generates a random value drawn from the Gaussian (normal) distribution
 | |
| with mean zero and standard deviation one, whose density function is 
 | |
| proportional to exp(-<I>x<SUP><SMALL>2</SMALL></SUP></I>/2), with <I>x</I>
 | |
| being any real value.
 | |
| 
 | |
| 
 | |
| <A NAME="logistic"><HR><B>rand_logistic</B>: 
 | |
| Generate a logistic random variate.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| double rand_logistic (void)
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Generates a random value drawn from the logistic distribution with
 | |
| location parameter zero and width parameter one, whose density
 | |
| function is proportional to 
 | |
| exp(-<I>x</I>) / [1 + exp(-<I>x</I>)]<SUP><SMALL>2</SMALL></SUP>, 
 | |
| with <I>x</I> being any real value.
 | |
| 
 | |
| 
 | |
| <P><A NAME="cauchy"><HR><B>rand_cauchy</B>:
 | |
| Generate a Cauchy random variate.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| double rand_cauchy (void)
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Generates a random value drawn from the Cauchy distribution with centre
 | |
| at zero and width one, whose density function is proportional to 
 | |
| 1 / (1+<I>x<SUP><SMALL>2</SMALL></SUP></I>), with <I>x</I> being any real value.
 | |
| 
 | |
| 
 | |
| <P><A NAME="gamma"><HR><B>rand_gamma</B>:
 | |
| Generate a gamma-distributed random variate.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| double rand_gamma
 | |
| ( double A   /* Shape parameter */
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Generates a random value drawn from the gamma distribution with
 | |
| positive shape parameter <I>A</I>, whose density function is proportional
 | |
| to <I>x<SUP><SMALL>A-1</SMALL></SUP></I> exp(-<I>x</I>), with <I>x</I>
 | |
| being any positive real. This procedure will never return a value that is
 | |
| exactly zero.
 | |
| 
 | |
| 
 | |
| <P><A NAME="exp"><HR><B>rand_exp</B>:
 | |
| Generate an exponentially-distributed random variate.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| double rand_exponential (void)
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Generates a random value drawn from the exponential distribution with 
 | |
| mean one, whose density function is exp(-<I>x</I>), with <I>x</I> being
 | |
| any positive real.  This procedure will never return a value that is
 | |
| exactly zero. 
 | |
| 
 | |
| <P>Note: This is a common special case of the gamma distribution.
 | |
| 
 | |
| 
 | |
| <P><A NAME="beta"><HR><B>rand_beta</B>:
 | |
| Generate a beta-distributed random variate.</A>
 | |
| 
 | |
| <BLOCKQUOTE><PRE>
 | |
| double rand_beta
 | |
| ( double A,  /* Parameters of distribution */
 | |
|   double B
 | |
| )
 | |
| </PRE></BLOCKQUOTE>
 | |
| 
 | |
| <P>Generates a random value drawn from the beta distribution with positive
 | |
| parameters <I>A</I> and <I>B</I>, whose density function is proportional
 | |
| to <I>x<SUP><SMALL>A-1</SMALL></SUP>(1-x)<SUP><SMALL>B-1</SMALL></SUP></I>,
 | |
| with <I>x</I> being any real in the interval (0,1).  This procedure
 | |
| will never return a value that is exactly zero or exactly one.
 | |
| 
 | |
| 
 | |
| <HR>
 | |
| 
 | |
| <A HREF="index.html">Back to index for LDPC software</A>
 | |
| 
 | |
| </BODY></HTML>
 |