Zufallszahlen: gleichverteilt, normalverteilt, dreiecksverteilt
-
in Abhängigkeit von d soll die Funktion unterschiedlich verteilte Zufallszahlen erzeugen:
float OutputParams::ranx(int d, float m, float s) { float rv; // d = Art der Verteilung: // 0 : Wert zw. m-s und m+s (gleichverteilt) // 1 : Wert normalverteilt um m mit s=s // 2 : Dreiecksverteilung switch(d) { case 0 : rv = 2.0*(float)rand()/(float)RAND_MAX-1.0; // Wert zw. -1 und 1 (gleichverteilt) rv = m+s*rv; // Wert zw. m-s und m+s (gleichverteilt) break; case 1 : rv = ranNorm(); // Wert normalverteilt um Null mit s=1 rv = m+s*rv; // Wert normalverteilt um m mit s=s break; case 2 : rv = -1; // Wert dreiecksverteilt break; default : rv = -2; // Wert = m, d.h. const. - keine Verteilung break; } return(rv); }
Normalverteilt hab ich:
float OutputParams::ranNorm() //N(0,1), d.h. Wert normalverteilt um Null mit s=1 { static int iset=0; static float gset; float rnum; float fac; float rsq; float v1,v2; if ( iset == 0 ) { do { v1 = 2.0*(float)rand()/(float)RAND_MAX-1.0; v2 = 2.0*(float)rand()/(float)RAND_MAX-1.0; rsq = v1*v1+v2*v2; } while ( rsq >= 1.0 || rsq == 0.0); fac = sqrt(-2.0*log(rsq)/rsq); rnum = v1*fac; gset = v2*fac; iset = 1; } else { rnum = gset; iset = 0; } return rnum; }
Kann mir jemand sagen, wie ich dreiecksverteilte Zufallszahlen generieren kann?
mfG robi1806