#include <newran.h>
Inheritance diagram for DiscreteGen:
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 | |
Real * | p |
int * | ialt |
int | n |
Real * | val |
Real | mean |
Real | var |
|
Definition at line 533 of file newran.cpp. References Gen(), mean, n, square(), tron, val, and var.
|
|
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 } |
|
Definition at line 592 of file newran.cpp. References ialt, p, tron, and val.
|
|
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 } |
|
Reimplemented from Random. Definition at line 298 of file newran.h.
00298 { return mean; } |
|
Reimplemented from Random. Definition at line 920 of file newran.cpp.
00920 { return "DiscreteGen"; } |
|
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 } |
|
Definition at line 287 of file newran.h.
00287 {} // private so can't access
|
|
Reimplemented from Random. Definition at line 299 of file newran.h.
00299 { return var; } |
|
Definition at line 288 of file newran.h. Referenced by Gen(), Next(), and ~DiscreteGen(). |
|
Definition at line 290 of file newran.h. Referenced by DiscreteGen(). |
|
Definition at line 288 of file newran.h. Referenced by DiscreteGen(), Gen(), and Next(). |
|
Definition at line 288 of file newran.h. Referenced by Gen(), Next(), and ~DiscreteGen(). |
|
Definition at line 288 of file newran.h. Referenced by DiscreteGen(), Next(), and ~DiscreteGen(). |
|
Definition at line 290 of file newran.h. Referenced by DiscreteGen(). |