- /*
- * random.h
- *
- * Mersenne Twister random number generator.
- * From Makoto Matsumoto and Takuji Nishimura.
- *
- * Portable Windows Library
- *
- * Copyright (c) 1993-2000 Equivalence Pty. Ltd.
- *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.0 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- * the License for the specific language governing rights and limitations
- * under the License.
- *
- * The Original Code is Portable Windows Library.
- *
- * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
- *
- * Contributor(s): ______________________________________.
- *
- * $Log: random.h,v $
- * Revision 1.1 2000/02/17 12:05:02 robertj
- * Added better random number generator after finding major flaws in MSVCRT version.
- *
- */
- #ifndef _PRANDOM
- #define _PRANDOM
- #ifdef __GNUC__
- #pragma interface
- #endif
- /**Mersenne Twister random number generator.
- An application would create a static instance of this class, and then use
- if to generate a sequence of psuedo-random numbers.
- Usually an application would simply use PRandom::Number() but if
- performance is an issue then it could also create a static local variable
- such as:
- {
- static PRandom rand;
- for (i = 0; i < 10000; i++)
- array[i] = rand;
- }
- This method is not thread safe, so it is the applications responsibility
- to assure that its calls are single threaded.
- */
- class PRandom
- {
- public:
- /**Construct the random number generator.
- This version will seed the random number generator with a value based
- on the system time as returned by time() and clock().
- */
- PRandom();
- /**Construct the random number generator.
- This version allows the application to choose the seed, thus letting it
- get the same sequence of values on each run. Useful for debugging.
- */
- PRandom(
- DWORD seed /// New seed value, must not be zero
- );
- /**Set the seed for the random number generator.
- */
- void SetSeed(
- DWORD seed /// New seed value, must not be zero
- );
- /**Get the next psuedo-random number in sequence.
- This generates one pseudorandom unsigned integer (32bit) which is
- uniformly distributed among 0 to 2^32-1 for each call.
- */
- unsigned Generate();
- /**Get the next psuedo-random number in sequence.
- */
- inline operator unsigned() { return Generate(); }
- /**Get the next psuedo-random number in sequence.
- This utilises a single system wide thread safe PRandom variable. All
- threads etc will share the same psuedo-random sequence.
- */
- static unsigned Number();
- protected:
- enum { N = 624 }; /* cycle size */
- unsigned long mt[N]; /* the array for the state vector */
- int mti;
- };
- #endif // _PRANDOM
- // End Of File ///////////////////////////////////////////////////////////////