Box Generator / Sprache Ruby
StartSeite | BoxGenerator/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Hier der BoxGenerator in SpracheRuby. Das folgende Codeschnipsel ist wie folgt entstanden:
- Kopieren der C++-Implementation.
- Löschen aller in Ruby nicht benötigten Elemente.
- Den Konstruktor ersetzt die Methode initialize, die in Ruby immer privat ist.
- Der Zufallspunkt wird über die in der Standarddistribution enthaltene Klasse Complex modelliert.
- Example angefügt. Dies wird ausgeführt, wenn die Datei direkt und nicht über require verwendet wird.
| # -*-Ruby-*-
# generator for gaussian deviates (Box-Mueller)
require 'complex'
class RandomBoxMueller
public
# move to the next element of the pseudo
# random sequence
def next
if @realAvail
@realAvail = false;
else
generate
end
end
# pseudo random deviate from the gaussian
# distribution
def lastGaussian
return @realAvail ? @pseudo.real : @pseudo.image
end
private
# generate two pseudo random deviates from
# a gaussian distribution
def generate
generateRandomPoint
factor = Math.sqrt!((-2 * Math.log(@product)) / @product)
@pseudo = @randomPoint * factor
@realAvail = true
end
# point from a uniform distribution on the area
# of the unit circle
def generateRandomPoint
begin
@randomPoint = Complex(getRandom, getRandom)
@product = @randomPoint.abs2
end while @product > 1
end
# wrap Kernel#rand to get what needed
def getRandom
return rand * 2 - 1
end
def initialize
@realAvail = false
end
end
# Example
if $0 == __FILE__
puts "Sample numbers from RandomBoxMueller"
generator = RandomBoxMueller.new
(1..10).each do |i|
generator.next
puts "#{i}: #{generator.lastGaussian}"
end
end |
|
|
Will man das Beispiel ohne Verwendung von Complex implementieren, so muss stattdessen das das Modul Math eingebunden werden. Nützlich können in diesem Fall Doppelzuweisungen sein:
Zum Thema Kapselung (darum ging es wohl in dem Beispiel?) ist zu sagen, dass es in Ruby auch noch das Schlüsselwort protected gibt. Die Interpretation ist leicht anders als etwa in SpracheJava. Nachzulesen in dem für Anfänger empfehlenswerten Buch Programmieren mit Ruby von Armin Röhrl, StefanSchmiedl und Clemens Wyss, welches auch online verfügbar ist: http://www.ruby.ch/en/rubymain.shtml. Ruby ist dynamisch typisiert, d. h. auch die Methodenkapselung kann nur dynamisch überprüft werden. Das Durchbrechen der Kapselung führt zu einem Laufzeitfehler.
Zugriffsmethoden auf Instanzvariablen können en block definiert werden. Das kann sogar nachträglich (dynamisch) erfolgen:
| class RandomBoxMueller
attr_reader : first, second
end |
|
|
In Ruby können sogar einzelnen Instanzen Methoden und damit implizit auch Instanzvariablen zugefügt werden!
To Do: Regressionstest; Idee: Eine Instanz der Klasse erstellen und dieser eine Methode #rand geben. Für die neue Instanz überschreibt #rand das Kernel#rand und liefert nicht Zufallszahlen sondern eine vorgegebenen Folge von Testzahlen.
Noch ein paar Bemerkungen zum Thema Zufallszahlen in Ruby.
Die oben verwendete Kernel-Methode rand ist je nach Anforderung an die Qualität einer Zufallszahl nicht immer geeignet. Im Ruby-Archiv RAA gibt es mit RandomR (in der Kategorie Math) einen weiteren Zufallszahlengenerator, der auf einer C-Implementation namens Mersenne Twister basiert.
Einige nützliche Hinweise zur Verwendung von Zufallszahlen gibt der Ruby Developer's Guide, an dem neben den Autoren Robert Feldt und Lyle Johnson auch Michael Neumann als Technical Editor mitgewirkt hat. Es gibt auch ein Ruby-Gem für EchteZufallsZahlen durch Zugriff auf entsprechende Webseiten http://www.maik-schmidt.de/realrand.html.
KategorieRuby KategorieProgrammierBeispiele
StartSeite | BoxGenerator/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 22. November 2004 14:21 (diff))