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:
# -*-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:

  @first, @second = x, y

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))
Suchbegriff: gesucht wird
im Titel
im Text