Box Generator
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Das Verfahren von Box und Mueller liefert zwei unabhängige standardnormalverteilte Zufallszahlen als Transformation eines Punktes, der aus einer Gleichverteilung auf dem Einheitskreis gewählt ist. Sollen alle so erzeugten Zufallszahlen als eine Folge von Pseudozufallszahlen genutzt werden, bietet es sich an, das Erzeugen und Verbrauchen solcher Zufallszahlen in einem Objekt zu kapseln.

Dabei werden die Aspekte Abstraktion und Kapselung über eine Objekt verwendet. Die Aspekte Polymorphismus und Vererbung des objektorientierten Ansatzes spielen in diesem Fall keine Rolle.

In der von BertrandMeyer in ObjectOrientedSoftwareConstruction eingeführten Notation (die nahezu identisch zur Programmiersprache Eiffel [SpracheEiffel] ist), lässt sich das Zusammenwirken von Erzeugen und Verbrauchen nach dieser Methode so darstellen:

indexing
   "generator for gaussian deviates (Box-Mueller)"

class 
   RNDBOX

creation 
   make

feature {ANY}
   make
   is
   do
      !!random.make
      available := false
   end

feature {ANY}
   next 
   -- move to the next element of the pseudo random 
   -- sequence
   is
   do
      -- moving to the next element either uses up one 
      -- deviate or triggers the generation of two new 
      -- deviates
      if available then
          available := false
      else
          generate
      end
   end
   
feature {ANY}
   last_gaussian : DOUBLE
   -- pseudo random deviate from the 
   -- gaussian distribution
   is
   do
      if available then
         Result := first
      else
         Result := second
      end
   end

feature {NONE}
   generate
   -- generate two pseudo random deviates from a 
   -- gaussian distribution
   is
   local
      p : DOUBLE
   do
      randpoint
      p := ((-2 * product.log) / product).sqrt
      available := true
      first := p * x
      second := p * y
   end

feature {NONE}
   randpoint 
   -- a point from a uniform distribution on the area 
   -- of the unit circle
   is
   do
      from
         product := 2
      until
         product <= 1 
      loop 
         x := randuniv * 2 - 1
         y := randuniv * 2 - 1
         product := x * x + y * y
      end
   end

feature {NONE}
   x, y, product, first, second : DOUBLE
   
feature {NONE}
   available : BOOLEAN

feature {NONE}
   -- internal wrapper for uniform distribution on 
   -- unit interval
   randuniv : DOUBLE
   is
   do
      random.next
      Result := random.last_real
   end

feature {NONE}
   random : MIN_STAND

end


Implementationen

Weil es bei dem Konzept des paarweisen Erzeugens und einzelnen Verbrauchens von Pseudozufallszahlen nicht auf alle Aspekte der objektorientierten Programmierung ankommt, bietet sich dieses Konzept auch an, verschiedene Ansätze zur Abstraktion und Kapselung in Programmiersprachen an einem Beispiel darzustellen

Implementation in imperativen Programmiersprachen

Die SpracheCpp und die SpracheModula3 enthalten natürlich auch objektorientierte Elemente, dort bilden sie aber nicht die zentralen Sprachkonzepte. Deswegen passen sie besser hierher als zum nächsten Punkt. -- HenningThielemann

Implementationen in imperativen, objektorientierten Programmiersprachen

Implementationen in Skriptsprachen

Implementationen in funktionalen Sprachen

Fragen zur Implementation


KategorieAlgorithmus
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert am 16. Mai 2007 20:27 (diff))
Suchbegriff: gesucht wird im Titel im Text