3
#include "base/basictypes.h"
5
// George Marsaglia-style random number generator.
13
m_w = seed ^ (seed << 16);
16
if (!m_z) m_z = 31337;
19
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
20
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
21
return (m_z << 16) + m_w;
24
return (float)R32() / (float)(0xFFFFFFFF);
27
// public for easy save/load. Yes a bit ugly but better than moving DoState into native.
33
// Data must consist only of the index and the twister array. This matches the PSP
34
// MT context exactly.
35
class MersenneTwister {
37
MersenneTwister(uint32_t seed) : index_(0) {
39
for (uint32_t i = 1; i < MT_SIZE; i++)
40
mt_[i] = (1812433253UL * (mt_[i - 1] ^ (mt_[i - 1] >> 30)) + i);
46
uint32_t y = mt_[index_];
48
y ^= (y << 7) & 2636928640UL;
49
y ^= (y << 15) & 4022730752UL;
51
index_ = (index_ + 1) % MT_SIZE;
61
uint32_t mt_[MT_SIZE];
64
for(uint32_t i = 0; i < MT_SIZE; i++){
65
uint32_t y = (mt_[i] & 0x80000000) + (mt_[(i + 1) % MT_SIZE] & 0x80000000);
66
mt_[i] = mt_[(i + 397) % MT_SIZE] ^ (y >> 1);
67
if (y % 2) mt_[i] ^= 2567483615UL;