Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals

DiscreteGen Class Reference

#include <newran.h>

Inheritance diagram for DiscreteGen:

Inheritance graph
[legend]
Collaboration diagram for DiscreteGen:

Collaboration graph
[legend]

Public Member Functions

char * Name ()
 DiscreteGen (int, Real *)
 DiscreteGen (int, Real *, Real *)
virtual ~DiscreteGen ()
Real Next ()
ExtReal Mean () const
ExtReal Variance () const

Private Member Functions

void operator= (const DiscreteGen &)
void Gen (int, Real *)

Private Attributes

Realp
int * ialt
int n
Realval
Real mean
Real var

Constructor & Destructor Documentation

DiscreteGen::DiscreteGen int  ,
Real
 

Definition at line 533 of file newran.cpp.

References Gen(), mean, n, square(), tron, val, and var.

00535 {
00536    #ifdef MONITOR
00537       tron << "constructing DiscreteGen\n";
00538    #endif
00539    Gen(n1, prob); val=0;
00540    mean=0.0; var=0.0;
00541    { for (int i=0; i<n; i++) mean = mean + i*prob[i]; }
00542    { for (int i=0; i<n; i++) var = var + square(i-mean) * prob[i]; }
00543 }

DiscreteGen::DiscreteGen int  ,
Real ,
Real
 

Definition at line 545 of file newran.cpp.

References ErrorNoSpace(), Gen(), mean, n, Real, square(), tron, val, and var.

00548 {
00549    #ifdef MONITOR
00550       tron << "constructing DiscreteGen\n";
00551    #endif
00552    Gen(n1, prob); val = new Real[n1];
00553    if (!val)  ErrorNoSpace();
00554    for (int i=0; i<n1; i++) val[i]=val1[i];
00555    mean=0.0; var=0.0;
00556    { for (int i=0; i<n; i++) mean = mean + val[i]*prob[i]; }
00557    { for (int i=0; i<n; i++) var = var + square(val[i]-mean)*prob[i]; }
00558 }

DiscreteGen::~DiscreteGen  )  [virtual]
 

Definition at line 592 of file newran.cpp.

References ialt, p, tron, and val.

00593 {
00594    delete [] p; delete [] ialt; delete [] val;
00595    #ifdef MONITOR
00596       tron << "destructing DiscreteGen\n";
00597    #endif
00598 }


Member Function Documentation

void DiscreteGen::Gen int  ,
Real
[private]
 

Definition at line 561 of file newran.cpp.

References ErrorNoSpace(), ialt, n, p, and Real.

Referenced by DiscreteGen().

00562 {
00563    n=n1;                                         // number of values
00564    p=new Real[n]; ialt=new int[n];
00565    if (!p || !ialt)  ErrorNoSpace();
00566    Real rn = 1.0/n; Real px = 0; int i;
00567    for (i=0; i<n; i++) { p[i]=0.0; ialt[i]=-1; }
00568    for (i=0; i<n; i++)
00569    {
00570       Real pmin=1.0; Real pmax=-1.0; int jmin=-1; int jmax=-1;
00571       for (int j=0; j<n; j++)
00572       {
00573          if (ialt[j]<0)
00574          {
00575             px=prob[j]-p[j];
00576             if (pmax<=px) { pmax=px; jmax=j; }
00577             if (pmin>=px) { pmin=px; jmin=j; }
00578          }
00579       }
00580       if ((jmax<0) || (jmin<0)) Throw(Runtime_error("Newran: method fails"));
00581       ialt[jmin]=jmax; 
00582                 px=rn-pmin; 
00583                 p[jmax]+=px; 
00584                 px*=n; 
00585                 p[jmin]=px;
00586       if ((px>1.00001)||(px<-.00001))
00587          Throw(Runtime_error("Newran: probs don't add to 1 (a)"));
00588    }
00589    if (px>0.00001) Throw(Runtime_error("Newran: probs don't add to 1 (b)"));
00590 }

ExtReal DiscreteGen::Mean  )  const [inline, virtual]
 

Reimplemented from Random.

Definition at line 298 of file newran.h.

00298 { return mean; }

char * DiscreteGen::Name  )  [virtual]
 

Reimplemented from Random.

Definition at line 920 of file newran.cpp.

00920 { return "DiscreteGen";      }

Real DiscreteGen::Next  )  [virtual]
 

Reimplemented from Random.

Definition at line 600 of file newran.cpp.

References ialt, n, Random::Next(), p, Real, and val.

Referenced by MixedRandom::Next().

00601 {
00602    int i = (int)(n * Random::Next()); 
00603         Real    t = Random::Next();
00604         if( t < p[i] )
00605                 i = ialt[i];
00606    return val ? val[i] : (Real)i;
00607 }

void DiscreteGen::operator= const DiscreteGen  )  [inline, private]
 

Definition at line 287 of file newran.h.

00287 {}  // private so can't access

ExtReal DiscreteGen::Variance  )  const [inline, virtual]
 

Reimplemented from Random.

Definition at line 299 of file newran.h.

00299 { return var; }


Field Documentation

int* DiscreteGen::ialt [private]
 

Definition at line 288 of file newran.h.

Referenced by Gen(), Next(), and ~DiscreteGen().

Real DiscreteGen::mean [private]
 

Definition at line 290 of file newran.h.

Referenced by DiscreteGen().

int DiscreteGen::n [private]
 

Definition at line 288 of file newran.h.

Referenced by DiscreteGen(), Gen(), and Next().

Real* DiscreteGen::p [private]
 

Definition at line 288 of file newran.h.

Referenced by Gen(), Next(), and ~DiscreteGen().

Real* DiscreteGen::val [private]
 

Definition at line 288 of file newran.h.

Referenced by DiscreteGen(), Next(), and ~DiscreteGen().

Real DiscreteGen::var [private]
 

Definition at line 290 of file newran.h.

Referenced by DiscreteGen().


The documentation for this class was generated from the following files:
Generated on Fri Dec 5 04:06:18 2003 for Borqueror by doxygen 1.3.3