windows-nt/Source/XPSP1/NT/enduser/netmeeting/t120/h/random.h
2020-09-26 16:20:57 +08:00

345 lines
7.7 KiB
C++

/*
* random.h
*
* Copyright (c) 1993-1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the interface file for the RandomNumberGenerator class.
* Instances of this class can generate random numbers within a specifed
* range on demand. Many of these objects can exist at once, and they
* will not interfere with each other.
*
* Caveats:
* None.
*
* Author:
* James J. Johnstone IV
*/
#ifndef _RANDOM_
#define _RANDOM_
/*
* The data type of the return value of the RandomNumberGenerator class.
*/
typedef ULong RandomValue;
#ifdef USE_RANDOM_CLASS
/*
* This typedef is an enumeration of all possible random number generation
* algorithms and is used when constructing a new random number generator.
* See "Numerical Recipes in 'C'" for details as to the difference between
* the various algorithms.
*/
typedef enum
{
ALGORITHM_RAN1,
ALGORITHM_RANQD2,
ALGORITHM_RAN4
} Algorithm;
typedef Algorithm * PAlgorithm;
/*
* The default algorithm for the random number generator object.
*/
#define DEFAULT_ALGORITHM ALGORITHM_RAN1
/*
* If specified as the seed value, a random seed will be generated by the
* random number generator.
*/
#define RANDOM_SEED 0
/*
* Defines for ran1() algorithm from "Numerical Recipes in 'C'"
*/
#define IA 16807
#define IM 2147483647L
#define AM (1.0/IM)
#define IQ 127773L
#define IR 2836
#define NTAB 32
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
/*
* Defines for ranqd2() algorithm from "Numerical Recipes in 'C'"
*/
#define RANQD2_A 1664525L
#define RANQD2_C 1013904223L
/*
* Defines for ranqd2() and ran4() algorithms from "Numerical Recipes in 'C'"
*/
#define JFLONE 0x3f800000L
#define JFLMSK 0x007fffffL
/*
* Defines for the ran4() algorithm from "Numerical Recipes in 'C'"
*/
#define NITER 4
/*
* The definition of the RandomNumberGenerator class.
*/
class RandomNumberGenerator
{
public:
RandomNumberGenerator ();
RandomNumberGenerator (
ULong seed);
RandomNumberGenerator (
Algorithm algorithm);
RandomNumberGenerator (
Algorithm algorithm,
ULong seed);
virtual ~RandomNumberGenerator ();
RandomValue GetRandomNumber (
RandomValue lo_extent,
RandomValue hi_extent);
Void Reseed ();
Void Reseed (
ULong seed);
private:
Void GenerateSeed (
ULong seed);
Float RAN1UniformDeviate ();
Float RAN4UniformDeviate ();
Void PseudoDESHashing (
ULong *lword,
ULong *irword);
Algorithm Algorithm_In_Use;
Long Running_Random_Number;
};
typedef RandomNumberGenerator * PRandomNumberGenerator;
/*
* RandomNumberGenerator ()
*
* Functional Description:
* This version of the constructor is used to create a random number
* generator object that has been automatically seeded with the current
* time. The default algorithm will be used.
*
* Formal Parameters:
* None.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* RandomNumberGenerator (
* ULong seed)
*
* Functional Description:
* This version of the constructor is used to create a random number
* generator object which is seeded with the supplied value. The default
* algorithm will be used.
*
* Formal Parameters:
* seed (i)
* A value used to seed the random number generator. If the seed value
* is zero, the random number generator object will use a random seed
* value based on the time.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* RandomNumberGenerator (
* Algorithm algorithm)
*
* Functional Description:
* This version of the constructor is used to create a random number
* generator object that has been automatically seeded with the current
* time. The algorithm specifies the algorithm to be used.
*
* Formal Parameters:
* algorithm (i)
* The random number generation algorithm to be used. The parameter
* algorithm must be one of the following:
*
* ALGORITHM_RAN1
* A good general purpose algorithm with a rather long period.
* This algorithm was benchmarked on a Gateway 2000 486/33C at
* 29+ Kops (thousand operations per second).
* ALGORITHM_RANQD2
* A quick and dirty algorithm. Use this algorithm if speed is an
* issue and the period of the random sequence is unimportant.
* This algorithm was benchmarked on a Gateway 2000 486/33C at
* 49+ Kops (thousand operations per second).
* ALGORITHM_RAN4
* A slow algorithm with an exceptionally long period.
* This algorithm was benchmarked on a Gateway 2000 486/33C at
* 18+ Kops (thousand operations per second).
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* RandomNumberGenerator (
* Algorithm algorithm,
* ULong seed)
*
* Functional Description:
* This version of the constructor is used to create a random number
* generator object which is seeded with the supplied value. The algorithm
* specified the algorithm to be used.
*
* Formal Parameters:
* algorithm (i)
* The random number generation algorithm to be used. The parameter
* algorithm must be one of the following:
*
* ALGORITHM_RAN1
* A good general purpose algorithm with a rather long period.
* This algorithm was benchmarked on a Gateway 2000 486/33C at
* 29+ Kops (thousand operations per second).
* ALGORITHM_RANQD2
* A quick and dirty algorithm. Use this algorithm if speed is an
* issue and the period of the random sequence is unimportant.
* This algorithm was benchmarked on a Gateway 2000 486/33C at
* 49+ Kops (thousand operations per second).
* ALGORITHM_RAN4
* A slow algorithm with an exceptionally long period.
* This algorithm was benchmarked on a Gateway 2000 486/33C at
* 18+ Kops (thousand operations per second).
* seed (i)
* A value used to seed the random number generator. If the seed value
* is zero, the random number generator object will use a random seed
* value based on the time.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* ~RandomNumberGenerator ()
*
* Public
*
* Functional Description:
* This is the destructor for the RandomNumberGenerator class.
*
* Formal Parameters:
* None.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* RandomValue GetRandomNumber (
* RandomValue lo_extent,
* RandomValue hi_extent)
*
* Public
*
* Functional Description:
* This method is used to generate a random number between the
* specified values.
*
* Formal Parameters:
* lo_extent (i)
* The lowest number you wish to receive.
* hi_extent (i)
* The highest number you wish to receive.
*
* Return Value:
* A RandomValue in the range specified.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void Reseed ()
*
* Public
*
* Functional Description:
* This method is used to reseed the random number generator object using
* the system time as the seed value.
*
* Formal Parameters:
* None.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void Reseed (
* ULong seed)
*
* Public
*
* Functional Description:
* This method is used to reseed the random number generator object using
* the specified seed value.
*
* Formal Parameters:
* seed (i)
* A value used to seed the random number generator. If the seed value
* is zero, the random number generator object will use a random seed
* value based on the time.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
#endif // USE_RANDOM_CLASS
#endif // _RANDOM_