Box Generator / Sprache Java Backup
 
StartSeite | BoxGenerator/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Eine trivial Implementation in SpracheJava.

HelmutLeitner meint dazu berechtigterweise: Ohne irgendeiner Sprache nahe treten zu wollen ... wenn ich die Implementierungen anschaue, dann zweifle ich wieder einmal an der Sinnschöpfungskraft der OO Paradigmen.

/**
  * Generiert standard verteilte PseudozufallsZahlen nach   
  * Box-Mueller.
  */

public class BoxGenerator
{
  /**
    * Gibt eine standard verteilte PseudozufallsZahl 
    * zurück.
    *
    * @returns double eine standard normal verteilte 
    * Zufallszahl
    */
  
  public double getGaussDistributedNumber()
  {
    double result;

    if (iHaveSavedARandom())
    {
      result = getSavedRandom();
    }
    else
    {
      RandomPair generatedRandoms = new RandomPair();
      setSavedRandom(generatedRandoms.getFirstRandom());
      result = generatedRandoms.getSecondRandom();
    }
    return result;
  }

  private synchronized void setSavedRandom(double random)
  {
    savedRandom = random;
    iHaveSavedARandom = true;
  }

  private synchronized double getSavedRandom()
  {
    iHaveSavedARandom = false;
    return savedRandom;
  }

  private synchronized boolean iHaveSavedARandom() 
  {
    return iHaveSavedARandom;
  }

  private boolean iHaveSavedARandom = false;
  private double savedRandom;

  /**
    * Kapselung des eigentlichen Algorithmus.
    */
  protected static class RandomPair
  {
    private double firstRandom;
    private double secondRandom;

    public RandomPair()
    {
      // Erzeugen eines Punktes im Einheitskreis
      double x = getUniformRandom();
      double y = getUniformRandom();
      while (getSummedProduct(x, y) > 1)
      {
        x = getUniformRandom();
        y = getUniformRandom();
      }

      // Berechnen des Transformationsfaktors
      double transformation;
      transformation = Math.log(getSummedProduct(x,y));
      transformation *= -2.0;
      transformation /= getSummedProduct(x,y);
      transformation  = Math.sqrt(transformation);

      // Ergebnis sichern
      firstRandom = x * transformation;
      secondRandom = y * transformation;
    }

    /**
      * Erzeugt eine gleichverteilte Zufallszahl im  
      * Bereich (-1.0,1.0). Hoffentlich. Die Java- 
      * Dokumentation war hier sehr unzureichend.
      * 
      * @returns double - eine gleichverteilte 
      * Zufalllszahl
      */
    protected double getUniformRandom() 
    {
      return (Math.random() - 0.5) * 2.0; 
    }

    private double getSummedProduct(double x, double y) 
    { 
      return (x*x + y*y); 
    }

    /**
     * Gibt die Erste der beiden erzeugten Zufallszahlen 
     * zurück.
     *
     * @returns double - eine standard normal verteilte      
     * Zufallszahl
     */
    public double getFirstRandom() 
      { return firstRandom; }

    /**
     * Gibt die Zweite der beiden erzeugten Zufalls- 
     * Zahlen zurück.
     *
     * @returns double - eine standard normal  
     * verteilte Zufallszahl
     */
    public double getSecondRandom() 
      { return secondRandom; }

  }
}


KategorieJava KategorieProgrammierBeispiele
StartSeite | BoxGenerator/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 22. Juni 2002 22:21 (diff))
Suchbegriff: gesucht wird
im Titel
im Text