Schnittstelle Für Zufallszahlengeneratoren Diskussion
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Die Sichtweise, dass nur das Weiterschalten eines Pseudozufallszahlengenerators eine Zustandsänderung bewirkt und der Zugriff deshalb eine andere Art von Operation ist als dieses Weiterschalten hat meiner Meinung nach einiges für sich. Das Thema Nebenläufigkeit ist in diesem Fall ohnehin ein Problem. Wenn mehrere Unabhängige Generatoren dieser Art nebeneinander existieren sollen, dann ist der Zugriff auf Math.random() keine gute Idee. Statt dessen muss dann wirklich jeder Generator dieser Art seine eigene Basis-Pseudozufallszahlenquelle haben (im Beispiel java.util.Random). Das synchronized verhindert zwar, dass sich mehrere Aufrufer bei Zustandsänderungen den Zustand des Monitors zerstören. Bei einem gemeinsamen Zugriff auf Math.random() sind die Zugreifenden auf eine Instanz von BoxGenerator aber nicht voneinander getrennt (im Sinne eines einzeln reproduzierbaren Verhaltens) -- KurtWatzka

Das ist zwar jetzt nicht Java-spezifisch, jedoch: so etwas hätte nur einen Sinn, wenn das Interface den Austausch des Generatortyps und die Initialisierung des zugrundeliegenden Generators (Reproduzierbarkeit) auch entsprechend unterstützen würde. Im Falle einer OO Implementation fühle ich mich da immer ein bisschen im Käfig der jeweiligen Implementation, während in einer PP? Implementation zumindest alle - wenn auch unsicheren Wege - offen stehen. -- HelmutLeitner

Ein Generator als eigenes Objekt, das in mehreren Instanzen - auch von verschiedenen Benutzern verwendet - reproduzierbare Zahlenfolgen erzeugt, ist sicher eine gute Form der Implementation. Die Trennung von Lesen und Zustandsänderung halte ich allerdings für keine gute Idee. Es öffnet die Tür für subtile Fehler (das Weiterschalten wird in bestimmten Situationen vergessen) und entspricht auch nicht der typischen Form der Benutzung, in der diese Trennung nicht vorkommt. -- hl

Hinter der Aufteilung der Schnittstelle in einen Zugriff "current" und eine Operation "next" steckt die Vorstellung, dass sich die Welt durch Anschauen nicht ändert. Die Erwartung, dass eine Zufallszahlenfolge durch das Anschauen des aktuellen Wertes automatisch auf den nächsten Wert weiterschaltet fällt in die gleiche Kategorie wie die Erwartung, dass durch den Zugriff auf das oberste Element eines Stacks dieses automatisch entfernt wird. Die Aufteilung der Schnittstelle eines Zufalszahlengenerators in einen Zugriff "current" und eine Operation "next" entspricht in meinen Augen gerade der Aufteilung der Schnittstelle eines Stacks in einen Zugriff "top" und eine Operation "pop". Ich vermute, dass die Erwartung dass ein Zugriff die Zufallszahlenfolge automatisch weiterschaltet stark durch das Verhalten von "rand()" beeinflusst ist. Wenn man erwartet, dass das Lesen an der aktuellen Position einer Zufallszahlenfolge ein automatisches Weiterschalten beinhaltet, dann würde man nach der gleichen Logik in C++ erwarten, dass der Dereferenzierungsoperator eines Iterators ein automatisches Postincrement enthaelt. -- kw

Hmm .. pop() gibt doch auch das oberste Element zurück? Man könnte somit
 int n = rng.next(); int c = current(); assert(c==n); 
?

Ob pop() das oberste Element zurueckgeben soll, oder ob die Methoden eines Objekts entweder eine Abfrage oder eine Operation sein sollen ist ja gerade die Frage. Natürlich kann pop() so implementiert werden, dass es das oberste Element zurückgibt und gleichzeitig die Operation entferne das oberste Element ausführt. Die durch das Command-Query Separation Principle aufgeworfene Frage ist ja gerade, ob das eine gute Schnittstelle für einen Stack ist. Es ist jedenfalls keine notwendige Schnittstelle für einen Stack. pop() muss nicht das oberste Element zuückgeben. Dass pop() als reine Operation implementiert werden kann zeigt die Standard Template Library von C++. -- kw

Von "müssen" kann keine Rede sein, weil Programmierer sich ohnehin frei fühlen, sprachliche Konsistenz zu misachten oder eigene sprachliche Erwartungen zu haben. Ein "pop" ist normalerweise immer ein "get+delete", so wie ein "read" immer ein "read+advance" ist. Ich vermute, dass "rand" den Erwartungen von "read" entspricht. -- HelmutLeitner 19. November 2005 19:27 CET


KategorieDiskussion
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 19. November 2005 19:27 (diff))
Suchbegriff: gesucht wird
im Titel
im Text