Noch besser gefällt mir aber die folgende Implementation, welche leichter auf höhere Dimensionen übertragen werden kann. [[Code] MODULE RndBox?; IMPORT Random, Math; TYPE OutIndex? = [0 .. 1]; REVEAL T = BRANDED REF RECORD random : Random.T; x, y, product: LONGREAL; out : ARRAY OutIndex? OF LONGREAL; outIndex : OutIndex?; END; PROCEDURE New (): T = BEGIN RETURN NEW(T, random := NEW(Random.Default).init(), outIndex := LAST(OutIndex?)); END New; PROCEDURE RandPoint? (SELF: T; ) = BEGIN WITH x = SELF.x, y = SELF.y, product = SELF.product DO REPEAT x := SELF.random.longreal(-1.0D0, 1.0D0); y := SELF.random.longreal(-1.0D0, 1.0D0); product := x * x + y * y; UNTIL product <= 1.0D0; END; END RandPoint?; PROCEDURE Generate (SELF: T; ) = BEGIN RandPoint?(SELF); WITH p = Math.sqrt((-2.0D0 * Math.log(SELF.product)) / SELF.product) DO SELF.out[0] := p * SELF.x; SELF.out[1] := p * SELF.y; END; END Generate; PROCEDURE Next (SELF: T; ) = BEGIN IF SELF.outIndex = LAST(OutIndex?) THEN Generate(SELF); SELF.outIndex := FIRST(OutIndex?); ELSE INC(SELF.outIndex); END; END Next; PROCEDURE LastGaussian? (SELF: T; ): LONGREAL = BEGIN RETURN SELF.out[SELF.outIndex]; END LastGaussian?; BEGIN END RndBox?. ] |
Zunächst die Schnittstelle in der Datei RndBox?.i3. Es ist Konvention, das Modul nach dem Datentyp zu benennen und den zugehörigen Modula3-Typen T. Alles was den Typen bezeichnet lässt man aus den Bezeichnern weg, denn dafür gibt es die Qualifikation. Man schreibt in den Programmen dann RndBox?.T oder RndBox?.New. Der Typ T wird als Untertyp von Zeigern mit automatischer Speicherverwaltung definiert. Modula-3 hält sich einen GarbageCollector und braucht daher keine explizite Freigabe des Zufallsgenerators.
![]() |
|
Jetzt kommt die Implementation in der Datei RndBox?.m3. Mit REVEAL deckt man auf, was sich denn nun wirklich hinter T verbirgt. Der Rest ist nicht weiter spektakulär.
![]() |
|
Um das Projekt komplett zu machen, gibt es noch eine Projektdatei namens m3makefile.
![]() |
|
Noch besser gefällt mir aber die folgende Implementation, welche leichter auf höhere Dimensionen übertragen werden kann.
![]() |
|