Rand.cpp File Reference
Random Value Generator Implementation. More...
#include <stdio.h>
#include <stdlib.h>
|
Defines |
#define | N (624) |
#define | M (397) |
#define | K (0x9908B0DFU) |
#define | hiBit(u) ((u) & 0x80000000U) |
#define | loBit(u) ((u) & 0x00000001U) |
#define | loBits(u) ((u) & 0x7FFFFFFFU) |
#define | mixBits(u, v) (hiBit(u)|loBits(v)) |
Functions |
void | seedMT (unsigned long seed) |
unsigned long | reloadMT (void) |
unsigned long | randomMT (void) |
float | frandomMT (void) |
Variables |
static unsigned long | state [N+1] |
static unsigned long * | next |
static int | left = -1 |
Detailed Description
Random Value Generator Implementation.
Grabbed by Kevin from http://www.math.keio.ac.jp/~matumoto/cokus.c
This is the ``Mersenne Twister'' random number generator MT19937, which generates pseudorandom integers uniformly distributed in 0..(2^32 - 1) starting from any odd seed in 0..(2^32 - 1). This version is a recode by Shawn Cokus (Cokus@math.washington.edu) on March 8, 1998 of a version by Takuji Nishimura (who had suggestions from Topher Cooper and Marc Rieffel in July-August 1997).
Effectiveness of the recoding (on Goedel2.math.washington.edu, a DEC Alpha running OSF/1) using GCC -O3 as a compiler: before recoding: 51.6 sec. to generate 300 million random numbers; after recoding: 24.0 sec. for the same (i.e., 46.5% of original time), so speed is now about 12.5 million random number generations per second on this machine.
According to the URL <http://www.math.keio.ac.jp/~matumoto/emt.html> (and paraphrasing a bit in places), the Mersenne Twister is ``designed with consideration of the flaws of various existing generators,'' has a period of 2^19937 - 1, gives a sequence that is 623-dimensionally equidistributed, and ``has passed many stringent tests, including the die-hard test of G. Marsaglia and the load test of P. Hellekalek and S. Wegenkittl.'' It is efficient in memory usage (typically using 2506 to 5012 bytes of static data, depending on data type sizes, and the code is quite short as well). It generates random numbers in batches of 624 at a time, so the caching and pipelining of modern systems is exploited. It is also divide- and mod-free.
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation (either version 2 of the License or, at your option, any later version). This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
The code as Shawn received it included the following notice:
Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. When you use this, send an e-mail to <matumoto@math.keio.ac.jp> with an appropriate reference to your work.
It would be nice to CC: <Cokus@math.washington.edu> when you write.
Define Documentation
#define hiBit |
( |
u |
|
) |
((u) & 0x80000000U) |
|
#define loBit |
( |
u |
|
) |
((u) & 0x00000001U) |
|
#define loBits |
( |
u |
|
) |
((u) & 0x7FFFFFFFU) |
|
#define mixBits |
( |
u, |
|
|
v |
|
) |
(hiBit(u)|loBits(v)) |
|
Function Documentation
float frandomMT |
( |
void |
|
) |
[inline] |
|
|
Get next random value form the generator - Returns:
- a real random value.
|
unsigned long randomMT |
( |
void |
|
) |
[inline] |
|
|
Get next random value from the generator - Returns:
- an integer random value.
|
unsigned long reloadMT |
( |
void |
|
) |
|
|
|
- Todo:
- Document this function
|
void seedMT |
( |
unsigned long |
seed |
) |
|
|
|
Initialise seed for Random Generator - Parameters:
-
| seed | The initial value of the pseudo random suite. |
|
Variable Documentation
unsigned long* next [static] |
|
unsigned long state[N+1] [static] |
|
Generated on Mon May 30 17:45:41 2005 for raknet by
1.4.2