/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#ifndef POLYGRAPH__XSTD_RNDDISTRS_H
#define POLYGRAPH__XSTD_RNDDISTRS_H
#include "xstd/Rnd.h"
// constant(mean) distribution
class ConstDistr: public RndDistr
{
public:
ConstDistr(RndGen *aGen, double aMean): RndDistr(aGen), theMean(aMean) {}
virtual const char *pdfName() const { return "const"; }
virtual double mean() const { return theMean; }
virtual double sdev() const { return 0; }
virtual double trial() { return theMean; }
protected:
double theMean;
};
// uniform[lo,hi) distribution
class UnifDistr: public RndDistr
{
public:
UnifDistr(RndGen *aGen, double aLo, double aHi);
virtual const char *pdfName() const { return "unif"; }
virtual double mean() const { return (theLo+theHi)/2; }
virtual double sdev() const { return range()/sqrt(12.); }
double range() const { return theHi-theLo; }
virtual double trial() { return theLo + range()*theGen->trial(); }
virtual ostream &print(ostream &os, ArgPrinter p = &RndDistr_DefArgPrinter) const;
protected:
double theLo;
double theHi;
};
// exponential(mean) distribution
class ExpDistr: public RndDistr
{
public:
ExpDistr(RndGen *aGen, double aMean): RndDistr(aGen), theMean(aMean) {}
virtual const char *pdfName() const { return "exp"; }
virtual double mean() const { return theMean; }
virtual double sdev() const { return theMean; }
virtual double trial();
protected:
double theMean;
};
// normal(mean, sdev) distribution
class NormDistr: public RndDistr
{
public:
NormDistr(RndGen *aGen, double aMean, double aSDev): RndDistr(aGen), theMean(aMean), theSDev(aSDev) {}
virtual const char *pdfName() const { return "norm"; }
virtual double mean() const { return theMean; }
virtual double sdev() const { return theSDev; }
virtual double trial();
virtual ostream &print(ostream &os, ArgPrinter p = &RndDistr_DefArgPrinter) const;
protected:
double theMean;
double theSDev;
};
// lognormal(mu, sigmaSq) distribution
class LognDistr: public NormDistr
{
public:
// creates using mean/sdev
static LognDistr *ViaMean(RndGen *aGen, double aMean, double aSDev);
// creates using mu/sigma
static LognDistr *ViaMu(RndGen *aGen, double aMu, double aSigmaSq);
public:
virtual const char *pdfName() const { return "logn"; }
virtual double mean() const;
virtual double sdev() const;
virtual double trial();
virtual ostream &print(ostream &os, ArgPrinter p = &RndDistr_DefArgPrinter) const;
protected:
LognDistr(RndGen *generator, double aMu, double aSigmaSq, double aMean, double aSDev);
protected:
double theRealMean;
double theRealSDev;
};
// classic Zipf(#objects) distribution (exponent == 1)
class ZipfDistr: public RndDistr
{
public:
ZipfDistr(RndGen *aGen, int aWorldCap): RndDistr(aGen), theWorldCap(aWorldCap) {}
virtual const char *pdfName() const { return "zipf"; }
virtual double mean() const { return -1; } // infinite mean
virtual double sdev() const { return 0; } // infinite dev?
double omega() const;
virtual double trial();
int ltrial(int min, int max);
virtual ostream &print(ostream &os, ArgPrinter p = &RndDistr_DefArgPrinter) const;
protected:
int theWorldCap;
};
// generates sequential ids: 1, 2, 3, ...
class SeqDistr: public RndDistr
{
public:
SeqDistr(RndGen *aGen, int aFirstId = 1);
virtual const char *pdfName() const { return "seq"; }
virtual double mean() const { return -1; } // infinite mean
virtual double sdev() const { return 0; } // infinite dev?
virtual double trial();
virtual ostream &print(ostream &os, ArgPrinter p = &RndDistr_DefArgPrinter) const;
protected:
int theFirstId;
int theLastId;
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1