2 * $Logfile: /Freespace2/code/Math/StaticRand.cpp $
7 * static random functions. Return "random" number based on integer inut
10 * Revision 1.1 2002/05/03 03:28:09 root
14 * 2 10/07/98 10:53a Dave
17 * 1 10/07/98 10:49a Dave
19 * 4 3/17/98 12:16a Allender
20 * asteroids in multiplayer -- minor problems with position being correct
22 * 3 12/30/97 5:46p Lawrance
23 * Rename rnd() to rand_alt().
25 * 2 12/30/97 4:27p Lawrance
26 * Add new rnd() function that doesn't affect rand() sequence.
28 * 1 8/08/97 3:38p Allender
31 #include "staticrand.h"
34 int Semirand_inited = 0;
35 int Semirand[SEMIRAND_MAX];
37 // Initialize Semirand array.
44 for (i=0; i<SEMIRAND_MAX; i++)
45 Semirand[i] = (myrand() << 15) + myrand();
49 // Return a fairly random 32 bit value given a reasonably small number.
50 int static_rand(int num)
57 a = num & (SEMIRAND_MAX - 1);
58 b = (num >> SEMIRAND_MAX_LOG) & (SEMIRAND_MAX - 1);
59 c = (num >> (2 * SEMIRAND_MAX_LOG)) & (SEMIRAND_MAX - 1);
61 return Semirand[a] ^ Semirand[b] ^ Semirand[c];
64 // Return a random value in 0.0f .. 1.0f- (ie, it will never return 1.0f).
65 float static_randf(int num)
71 return (a & 0xffff) / 65536.0f;
74 float static_randf_range(int num, float min, float max)
78 rval = static_randf(num);
79 rval = rval * (max - min) + min;
85 void static_randvec(int num, vector *vp)
87 vp->x = static_randf(num) - 0.5f;
88 vp->y = static_randf(num+1) - 0.5f;
89 vp->z = static_randf(num+2) - 0.5f;
91 vm_vec_normalize_quick(vp);
94 /////////////////////////////////////////////////////////////////////
95 // Alternate random number generator, that doesn't affect rand() sequence
96 /////////////////////////////////////////////////////////////////////
97 #define RND_MASK 0x6000
98 #define RND_MAX 0x7fff
101 // Seed the random number generator. Doesn't have to be called.
102 void srand_alt(int seed)
107 // Get a random integer between 1 and RND_MAX
110 static int x=Rnd_seed;
120 // Get a random float between 0 and 1.0
124 return i2fl(r)/RND_MAX;