mud++0.35/etc/
mud++0.35/etc/guilds/
mud++0.35/help/propert/
mud++0.35/mudC/
mud++0.35/player/
mud++0.35/src/interface/
mud++0.35/src/os/cygwin32/
mud++0.35/src/os/win32/
mud++0.35/src/os/win32/bcppbuilder/
mud++0.35/src/osaddon/
mud++0.35/src/util/
/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All 
................................................ contributions are welcome. 
....Copyright(C).1995.Melvin.Smith.............. Enjoy. 
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@hom.net 
MUD++ development mailing list    mudpp@van.ml.org
------------------------------------------------------------------------------
random.h
*/

#ifndef _RANDOM_H
#define _RANDOM_H
#include <sys/time.h>


#define MAX_RAND 256
#define B 31415821

// Linear Congruential Method for generating random numbers
// Notice the sequence is prebuilt and stored in an array.
// Then each call just circles through the array.
// All we care about is "pseudo-random" numbers for the MUD simulation
//
// Profile information:
//  1,000,000 random numbers on 486/80
//
//	Prebuilt 			Non-prebuilt (calcs done each call)
//	0.70 sec CPU		0.96 sec CPU

class Random
{
	private:
		int random_seq[ MAX_RAND ];
		int next;

	public:
		Random()
		:	next(0)
		{
			struct timeval t;
			gettimeofday( &t, 0 );
			random_seq[0] = t.tv_usec; 
			for( int i = 1; i < MAX_RAND; i++ )
			{
				// Knock off the negative bit.
				random_seq[i] = ( random_seq[i-1] * B + 1 ) & 0x7fffffff;
			}
		}

		int get();
		int get( int );
		int get( int, int );
};


inline int Random::get()
{
	return random_seq[ (next++) % MAX_RAND ];
}

inline int Random::get( int max )
{
	// Sedgewick says this is a bad way to get small range random
	// numbers. Ill improve it sometime.
	if( !max )
		return 0;

	return random_seq[ (next++) % MAX_RAND ] % max;
}

inline int Random::get( int min, int max )
{
	if( max == min )
		return min;

	return min + (random_seq[ (next++) % MAX_RAND ] % ( max - min ) + 1);
}

extern Random randgen;
#endif