Lernprogramm oder Beispielcode zum Erweitern von c ++ 11 random mit Generatoren und Verteilungen

8

Ich habe Legacy-C ++ - Code, den ich geschrieben habe, um einheitliche Zufallszahlen und eine Gaußsche Verteilung zu erzeugen. Es implementiert Algorithmen von Dr. George Marsaglia, die extrem schnell sind. (Ich benutzte sie, um Skaillionen von Proben für die hochdimensionale Monte-Carlo-Integration zu erzeugen.)

Ich denke, es wäre eine gute Idee, den Generator und die Verteilung neu zu faktorisieren, um mit dem neuen C ++ 11-std :: random-Schema zu arbeiten.

Kann mir jemand auf ein Tutorial oder eine gute Referenz für std :: random verweisen, die die notwendigen Informationen enthält, um es zu erweitern? Beispielcode wäre ideal.

AKTUALISIEREN. Danke für die Hilfe von allen. Ich habe jetzt einen Drop-in-Ersatz für die mit Visual C ++ 2010 mitgelieferte std :: normal_distribution geschrieben. Auf meinem Computer ist der Austausch 26% schneller, wenn er von der Standard-Engine gespeist wird. Ich bin ein wenig enttäuscht, dass der Unterschied nicht größer ist, aber hey, das ist mein Problem. : -)

    
Jive Dadson 30.07.2012, 07:55
quelle

2 Antworten

5

N3376 ist der neueste Entwurf des C ++ - Standards (dieser ist post C ++ 11, ist aber ein ausgezeichneter Schnappschuss von C ++ 11).

Alles C ++ 11-random ist in: 26.5 Zufallsgenerierung [rand]

26.5.1.4 Random-Engine-Anforderungen [rand.req.eng] hat alle Anforderungen, die Ihr Generator für uniforme Zufallszahlen erfüllen muss.

26.5.1.6 Random-Nummer-Verteilungsanforderungen [rand.req.dist] hat alle Anforderungen, die Ihre Gauß-Verteilung erfüllen müsste.

26.5.8.5.1 Klassenvorlage normal_distribution [rand.dist.norm.normal] ist der Abschnitt, der die von std definierte Gaußsche Verteilung beschreibt.

Das C ++ 11 <random> ist sehr STL-ähnlich, da es Anforderungen für Zufallszahlengeneratoren (Container) und zufällige Verteilungen (Algorithmen) einrichtet, und dann kann der Client die beiden mischen und abgleichen. Es ist ein wirklich sehr cooles Design.

Tut mir leid, ich kenne kein gutes Tutorial. Der C ++ - Standard ist eine ausgezeichnete Referenz und ein lausiges Tutorial. Sie sind jedoch offensichtlich im Bereich der Zufallszahlen gut ausgebildet. Angenommen, Sie wissen etwas über C ++, der C ++ - Standard ist vielleicht nicht so schlecht.

Open-Source-Implementierungen von <random> sind verfügbar, wenn Sie ihre Quelle (für ein Beispiel) durchsuchen möchten. Ein Beispiel ist libc ++ . Alles, was sie fragen, ist, dass Sie ihre Urheberrechtshinweise behalten, wenn Sie ihren Code wiederverwenden.

Bearbeiten

Sie sind für das Schreiben dieses Lernprogramms eindeutig qualifiziert. : -)

    
Howard Hinnant 31.07.2012, 02:54
quelle
1

Sie können eine Menge lernen, indem Sie Boost-Bibliotheksquellen lesen, da viele Vorschläge in C ++ 11 von boost übernommen wurden.

Sehen Sie sich hier die Schnittstelle einer Beispiel-Rng-Engine an:

Ссылка

Ich würde damit beginnen, die Funktionen min max seed und operator () zu implementieren, um zu sehen, ob es als gültige Engine für C ++ 11 übergeben wird.

    
nurettin 30.07.2012 08:31
quelle