summaryrefslogtreecommitdiff
path: root/common/GameUI/Random.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /common/GameUI/Random.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'common/GameUI/Random.cpp')
-rw-r--r--common/GameUI/Random.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/common/GameUI/Random.cpp b/common/GameUI/Random.cpp
new file mode 100644
index 0000000..ec17986
--- /dev/null
+++ b/common/GameUI/Random.cpp
@@ -0,0 +1,131 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Basic random number generator
+//
+// $NoKeywords: $
+//===========================================================================//
+
+
+#include <time.h>
+#include "Random.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#define IA 16807
+#define IM 2147483647
+#define IQ 127773
+#define IR 2836
+#define NTAB 32
+#define NDIV (1+(IM-1)/NTAB)
+
+static long idum = 0;
+
+void SeedRandomNumberGenerator(long lSeed)
+{
+ if (lSeed)
+ {
+ idum = lSeed;
+ }
+ else
+ {
+ idum = -time(NULL);
+ }
+ if (1000 < idum)
+ {
+ idum = -idum;
+ }
+ else if (-1000 < idum)
+ {
+ idum -= 22261048;
+ }
+}
+
+long ran1(void)
+{
+ int j;
+ long k;
+ static long iy=0;
+ static long iv[NTAB];
+
+ if (idum <= 0 || !iy)
+ {
+ if (-(idum) < 1) idum=1;
+ else idum = -(idum);
+ for (j=NTAB+7;j>=0;j--)
+ {
+ k=(idum)/IQ;
+ idum=IA*(idum-k*IQ)-IR*k;
+ if (idum < 0) idum += IM;
+ if (j < NTAB) iv[j] = idum;
+ }
+ iy=iv[0];
+ }
+ k=(idum)/IQ;
+ idum=IA*(idum-k*IQ)-IR*k;
+ if (idum < 0) idum += IM;
+ j=iy/NDIV;
+ iy=iv[j];
+ iv[j] = idum;
+
+ return iy;
+}
+
+// fran1 -- return a random floating-point number on the interval [0,1)
+//
+#define AM (1.0/IM)
+#define EPS 1.2e-7
+#define RNMX (1.0-EPS)
+float fran1(void)
+{
+ float temp = (float)AM*ran1();
+ if (temp > RNMX) return (float)RNMX;
+ else return temp;
+}
+
+#ifndef _XBOX
+float RandomFloat( float flLow, float flHigh )
+{
+ if (idum == 0)
+ {
+ SeedRandomNumberGenerator(0);
+ }
+
+ float fl = fran1(); // float in [0,1)
+ return (fl * (flHigh-flLow)) + flLow; // float in [low,high)
+}
+#endif
+
+long RandomLong( long lLow, long lHigh )
+{
+ if (idum == 0)
+ {
+ SeedRandomNumberGenerator(0);
+ }
+
+ unsigned long maxAcceptable;
+ unsigned long x = lHigh-lLow+1;
+ unsigned long n;
+ if (x <= 0 || MAX_RANDOM_RANGE < x-1)
+ {
+ return lLow;
+ }
+
+ // The following maps a uniform distribution on the interval [0,MAX_RANDOM_RANGE]
+ // to a smaller, client-specified range of [0,x-1] in a way that doesn't bias
+ // the uniform distribution unfavorably. Even for a worst case x, the loop is
+ // guaranteed to be taken no more than half the time, so for that worst case x,
+ // the average number of times through the loop is 2. For cases where x is
+ // much smaller than MAX_RANDOM_RANGE, the average number of times through the
+ // loop is very close to 1.
+ //
+ maxAcceptable = MAX_RANDOM_RANGE - ((MAX_RANDOM_RANGE+1) % x );
+ do
+ {
+ n = ran1();
+ } while (n > maxAcceptable);
+
+ return lLow + (n % x);
+}
+
+