/* Steven Andrews, 5/12/95.
See documentation called random_doc.doc.
Copyright 2003-2007 by Steven Andrews.  This work is distributed under the terms
of the Gnu Lesser General Public License (LGPL). */

#ifndef __random_h
#define __random_h

#include <time.h>
#include <stdlib.h>
#include <math.h>

#define RAND_MAX_30 1073741823
#if RAND_MAX==32767
	#define rand30() ((long)rand()<<15|rand())
#elif RAND_MAX<RAND_MAX_30
	#define rand30() ((rand()&32767L)<<15|rand()&32767L)
#else
	#define rand30() (rand()&RAND_MAX_30)
#endif

#define exprand(a) (-log(((float)rand()+1.0)/(RAND_MAX+1.0))*(a))
#define exprand30(a) (-log(((double)rand30()+1.0)/(RAND_MAX_30+1.0))*(a))
#define unirand(lo,hi) ((float)rand()/RAND_MAX*((hi)-(lo))+(lo))
#define unirand30(lo,hi) ((double)rand30()/RAND_MAX_30*((hi)-(lo))+(lo))
#define signrand() (rand()&1?1:-1)
#define coinrand(p) (rand()<(RAND_MAX+1.0)*(p))
#define coinrand30(p) (rand30()<(RAND_MAX_30+1.0)*(p))
#define intrand(n) (rand()%(n))
#define intrand30(n) (rand30()%(n))
#define thetarand() (acos(1.0-2.0*rand()/RAND_MAX))
#define radrand1(r) ((r)*sqrt((float)rand()/RAND_MAX))
#define radrand2(r) ((r)*pow((float)rand()/RAND_MAX,0.333333333333))
#define powrand(xmin,power) (xmin*pow(((float)rand()+1.0)/(RAND_MAX+1.0),1.0/(1.0+power)))
#define powrand30(xmin,power) (xmin*pow(((double)rand30()+1.0)/(RAND_MAX_30+1.0),1.0/(1.0+power)))

unsigned int randomize();
float binomrand(int n,float m,float s);
int intrandp(int n,float *p);
int poisrand(float xm);
int poisrandD(double xm);
float binomialrand(float p,int n);
float gaussrand();
void sphererand(float *x,float rad1,float rad2);
void sphererandd(double *x,double rad1,double rad2);
void Rand_TriPtD(double *pt1,double *pt2,double *pt3,int dim,double *ans);
void randtable(float *a,int n,int eq);
void randtableD(double *a,int n,int eq);
void randshuffletable(float *a,int n);
void randshuffletableD(double *a,int n);
void showdist(int n,float low,float high,int bin);

#endif
