-
Notifications
You must be signed in to change notification settings - Fork 0
Randomness
microsoft.com rand
cppreference.com rand
Understanding the algorithm of Visual C++'s rand() function
Observed being called by WeatherManager_G
.
#define RAND_MAX 0x7fff
int rand() {
_ptiddata ptd = _getptd();
unsigned int r = 214013 * ptd->_holdrand + 2531011;
ptd->_holdrand = r;
return (r >> 16) & RAND_MAX;
}
Lehmer random number generator
From the book Numerical Recipes in C: The Art of Scientific Computing.
Similar to the Ran1
that appears in the Random_Z from MixedRealityToolkit/SpatialUnderstanding.
Gets called way more often than rand
.
static const int IA = 16807;
static const int IM = 0x7FFFFFFF;
static const int IQ = 127773;
static const int NTAB = 32;
static const int NDIV = (1+(IM-1)/NTAB); // 1+(0x7FFFFFFF-1)/32 = 0x4000000
static const double AM = (1.0f/IM); // 1.0f/0x7FFFFFFF = 4.6566129e-10
static const double EPS = 1.2e-7f;
static const double RNMX = (1.0f-EPS); // 0.99999988
static int idum = 0;
static int m_iY = 0;
static int m_iV[32] = {};
char CallbackInitRandomSeed() {
if (GlobalCommandManager->argc < 1 || !GlobalCommandManager->valueHasFloat[1])
return 0;
idum = (int)GlobalCommandManager->valueAsFloat[1];
if (idum >= 0)
idum = -idum;
Random_Z::ran1();
return 1;
}
double Random_Z::ran1() {
if (idum <= 0 || !m_iY) {
idum = -idum;
if (idum < 1)
idum = 1;
for (int j = NTAB + 7; j >= 0; j--) {
int k = idum / IQ;
idum = IA * idum - IM * k;
if (idum < 0)
idum += IM;
if (j < NTAB)
m_iV[j] = idum;
}
m_iY = m_iV[0];
}
int k = idum / IQ;
idum = IA * idum - IM * k;
if (idum < 0)
idum += IM;
int j = m_iY / NDIV;
m_iY = m_iV[j];
m_iV[j] = idum;
double temp = AM * m_iY;
if (temp > RNMX)
return RNMX;
return temp;
}
Usually inlined and rarely used compared to the other random functions.
static float idum2 = 0.5;
static float m_iY2 = 2.0;
double Random_Z::ran2() {
float f = (idum2 * 8.2145452 + m_iY2) * 1.4154547;
unsigned int r = *(unsigned int*)&f & 0x7FFFFF | 0x3F800000; // 1.X
return idum2 = *(float*)&r - 1.0; // 0.X
}
static unsigned int idum3 = 0;
static unsigned int m_iV3[16] = {
0xF147EB68, 0xBD4405CD, 0x0000136D, 0x990FD175,
0x09FBE6A9, 0x3D01097A, 0x8FB524CB, 0xD49E1A77,
0x3330BCA8, 0xE784C9AD, 0x1F5B734E, 0x035FA97C,
0xADB392A3, 0x57D83C79, 0x2178FE5B, 0x9B75EE37,
};
unsigned int Random_Z::ran3() {
unsigned int r = m_iV3[((unsigned char)idum3 - 3) & 0xF] ^ m_iV3[idum3] ^ ((r ^ (2 * m_iV3[idum3])) << 15);
unsigned int s = ((unsigned int)m_iV3[((unsigned char)idum3 - 7) & 0xF] >> 11) ^ m_iV3[((unsigned char)idum3 - 7) & 0xF];
m_iV3[idum3] = s ^ r;
idum3 = ((unsigned char)idum3 - 1) & 0xF;
return m_iV3[idum3] = m_iV3[idum3] ^ r ^ s ^ r ^ (32 * ((s ^ r) & 0xFED22169)) ^ (4 * (m_iV3[idum3] ^ ((r ^ (s << 10)) << 16)));
}
For FMTK Users and Mod Developers
For FMTK Developers
Asobo BigFile Format Specification
Asobo Classes
Animation_Z
Binary_Z
Bitmap_Z
Camera_Z
CollisionVol_Z
Fonts_Z
GameObj_Z
GenWorld_Z
GwRoad_Z
Keyframer*_Z
Light_Z
LightData_Z
Lod_Z
LodData_Z
Material_Z
MaterialAnim_Z
MaterialObj_Z
Mesh_Z
MeshData_Z
Node_Z
Omni_Z
Particles_Z
ParticlesData_Z
RotShape_Z
RotShapeData_Z
Rtc_Z
Skel_Z
Skin_Z
Sound_Z
Spline_Z
SplineGraph_Z
Surface_Z
SurfaceDatas_Z
UserDefine_Z
Warp_Z
World_Z
WorldRef_Z
Asobo File Format Idioms
Asobo CRC32
Asobo LZ Compression
Asobo Arithmetic Coding Compression
Asobo Save Game File Format Specification
Asobo Audio Formats
TotemTech/ToonTech/Zouna/ACE/BSSTech/Opal Timeline
Zouna Modding Resources
Miscellaneous