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


Anmelden zum Antworten