#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(). |
1.3.3