SLikeNet 0.1.3

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Macros | Functions | Variables
Rand.cpp File Reference
`#include <stdio.h>`
`#include <stdlib.h>`
`#include <string.h>`
`#include "slikenet/Rand.h"`

Go to the source code of this file.

## Macros

#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 int seed, unsigned int *state, unsigned int *&next, int &left)
unsigned int | reloadMT (unsigned int *state, unsigned int *&next, int &left)
unsigned int | randomMT (unsigned int *state, unsigned int *&next, int &left)
void | fillBufferMT (void *buffer, unsigned int bytes, unsigned int *state, unsigned int *&next, int &left)
float | frandomMT (unsigned int *state, unsigned int *&next, int &left)
void | seedMT (unsigned int seed)
unsigned int | reloadMT (void)
unsigned int | randomMT (void)
float | frandomMT (void)
void | fillBufferMT (void *buffer, unsigned int bytes)

## Variables

static unsigned int | _state [N+1]
static unsigned int * | _next
static int | _left = -1

## Macro Definition Documentation

#define hiBit | ( |  | u | ) | ((u) & 0x80000000U)

Definition at line 65 of file Rand.cpp.

#define K (0x9908B0DFU)

Definition at line 64 of file Rand.cpp.

Referenced by reloadMT().

#define loBit | ( |  | u | ) | ((u) & 0x00000001U)

Definition at line 66 of file Rand.cpp.

Referenced by reloadMT().

#define loBits | ( |  | u | ) | ((u) & 0x7FFFFFFFU)

Definition at line 67 of file Rand.cpp.

#define M (397)

Definition at line 63 of file Rand.cpp.

Referenced by reloadMT().

#define mixBits | ( |  | u,
|  |  | v
| ) |  | (hiBit(u)|loBits(v))

Definition at line 68 of file Rand.cpp.

Referenced by reloadMT().

#define N (624)

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.nosp@m.@mat.nosp@m.h.was.nosp@m.hing.nosp@m.ton.e.nosp@m.du) 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.

Licensing is free http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/elicense.html

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 matum.nosp@m.oto@.nosp@m.math..nosp@m.keio.nosp@m..ac.j.nosp@m.p with an appropriate reference to your work.

It would be nice to CC: Cokus.nosp@m.@mat.nosp@m.h.was.nosp@m.hing.nosp@m.ton.e.nosp@m.du when you write.

Note from SLikeSoft: The mail addresses here seem to be dead ends and we could not determine any current ways to contact the authors.

Definition at line 62 of file Rand.cpp.

Referenced by reloadMT(), and seedMT().

## Function Documentation

void fillBufferMT | ( | void * | buffer,
|  | unsigned int | bytes,
|  | unsigned int * | state,
|  | unsigned int *& | next,
|  | int & | left
| ) |  |

Definition at line 213 of file Rand.cpp.

References randomMT().

Referenced by fillBufferMT(), and SLNet::RakNetRandom::FillBufferMT().

void fillBufferMT | ( | void * | buffer,
|  | unsigned int | bytes
| ) |  |

Randomizes a buffer

Note
  not threadSafe, use an instance of RakNetRandom if necessary per thread

Definition at line 99 of file Rand.cpp.

References _left, _next, _state, and fillBufferMT().

float frandomMT | ( | unsigned int * | state,
|  | unsigned int *& | next,
|  | int & | left
| ) |  |

Definition at line 228 of file Rand.cpp.

References randomMT().

Referenced by frandomMT(), SLNet::RakNetRandom::FrandomMT(), and DataStructures::OrderedChannelHeap< channel_key_type, heap_data_type, channel_key_comparison_func >::PushAtHead().

float frandomMT | ( | void |  | ) |

Gets a random float

Note
  not threadSafe, use an instance of RakNetRandom if necessary per thread

Returns
  0 to 1.0f, inclusive

Definition at line 95 of file Rand.cpp.

References _left, _next, _state, and frandomMT().

unsigned int randomMT | ( | unsigned int * | state,
|  | unsigned int *& | next,
|  | int & | left
| ) |  |

Definition at line 192 of file Rand.cpp.

References reloadMT().

Referenced by fillBufferMT(), frandomMT(), randomMT(), and SLNet::RakNetRandom::RandomMT().

unsigned int randomMT | ( | void |  | ) |

Gets a random unsigned int

Note
  not threadSafe, use an instance of RakNetRandom if necessary per thread

Returns
  an integer random value.

Definition at line 91 of file Rand.cpp.

References _left, _next, _state, and randomMT().

unsigned int reloadMT | ( | unsigned int * | state,
|  | unsigned int *& | next,
|  | int & | left
| ) |  |

Definition at line 164 of file Rand.cpp.

References K, loBit, M, mixBits, N, and seedMT().

Referenced by randomMT(), reloadMT(), and SLNet::RakNetRandom::ReloadMT().

unsigned int reloadMT | ( | void |  | ) |

Definition at line 87 of file Rand.cpp.

References _left, _next, _state, and reloadMT().

void seedMT | ( | unsigned int | seed,
|  | unsigned int * | state,
|  | unsigned int *& | next,
|  | int & | left
| ) |  |

Definition at line 104 of file Rand.cpp.

References N.

Referenced by reloadMT(), seedMT(), and SLNet::RakNetRandom::SeedMT().

void seedMT | ( | unsigned int | seed | ) |

Initialise seed for Random Generator

Note
  not threadSafe, use an instance of RakNetRandom if necessary per thread

Parameters

  [in] | seed | The seed value for the random number generator.

Definition at line 83 of file Rand.cpp.

References _left, _next, _state, and seedMT().

## Variable Documentation

int _left = -1

static

Definition at line 72 of file Rand.cpp.

Referenced by fillBufferMT(), frandomMT(), randomMT(), reloadMT(), and seedMT().

unsigned int* _next

static

Definition at line 71 of file Rand.cpp.

Referenced by fillBufferMT(), frandomMT(), randomMT(), reloadMT(), and seedMT().

unsigned int _state[N+1]

static

Definition at line 70 of file Rand.cpp.

Referenced by fillBufferMT(), frandomMT(), randomMT(), reloadMT(), and seedMT().