Erstellen einer Gaussian-Random-Generator mit einem Mittelwert und die Standardabweichung
Ich versuche, erstellen Sie ein ein-dimensionales array und verwenden einen Zufallszahlengenerator(Gauß-generator, der eine Zufallszahl generiert, mit Hilfe von 70 und einer Standardabweichung von 10) füllen Sie das array mit mindestens 100 zahlen zwischen 0 und 100 inclusive.
Wie würde ich gehen über das tun dies in C++?
InformationsquelleAutor coder_For_Life22 | 2013-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C++11 das ist relativ straight forward mit dem random header und std::normal_distribution (live-Beispiel):
Wenn C++11 ist nicht eine option, als boost bietet auch eine Bibliothek(live-Beispiel):
und wenn Sie aus irgendeinem Grund keine dieser Optionen möglich ist, können Sie Rollen Sie Ihre eigenen Box-Muller-Transformation, den code aus dem link sieht zumutbar ist.
std::map<int, int> hist;
for (int n = 0; n < 100000; ++n) {++hist[std::round(dist())];}
und dann wird das Teilfor (auto p : hist) {...
? Tausend Dank im Voraus.erzeugt die normale Zufallsvariablen ...
hist
ist ein Satz Eimer für die Anzeige der Ergebnisse, um zu sehen, eine Gauß-graph, der Blick auf die live-Beispielen helfen können.Vielen Dank für immer zu mir zurück. Ich bin Herumspielen mit der live-Beispiel, aber immer noch zu kämpfen. Kurz, ich bin versucht zu schreiben, eine Schleife (die sagen, läuft 10 mal), wo bei jedem Lauf ich Generiere eine Zahl, die ausgewählt ist aus einer Gauß-Verteilung mit meine 0 und Varianz 0.05. Was ich getan habe:
std::random_device rd;
std::mt19937 e2(rd());
std::normal_distribution<float> dist(0, sqrt(0.05));
for (int i=0; i<10; i++){std::cout << dist(e2) << '\n';}
und es scheint zu funktionieren, aber ich weiß nicht, warum sollte ich passe2
? Ich versteherd
Samen hier, aber warum müssen wire2
?InformationsquelleAutor Shafik Yaghmour
Verwenden Sie die Box-Muller-Verteilung (aus hier):
Lesen Sie mehr unter: wolframe der Welt der Mathematik
Das tut es auch! beachten Sie
rand()
Funktion innerhalbrand_normal(double mean, double stddev)
. Vielleicht sind Sie fehlensrand(time(NULL))
vor der Verwendung dieser Funktion, und damit sind Sie immer auf dieselben zahlen.InformationsquelleAutor samad montazeri
Mit
#include <random>
InformationsquelleAutor yizzlez
In C++11 verwenden Sie die Einrichtungen durch die
<random>
header; ein Zufallsgenerator (z.B.std::default_random_engine
oderstd::mt19937
, initialisiert mitstd::random_device
wenn nötig) und einestd::normal_distribution
- Objekt initialisiert mit Ihren Parametern; dann können Sie Sie zusammen, um zu generieren Ihre zahlen. Hier finden Sie ein vollständiges Beispiel.In früheren Versionen von C++, statt, alles, was Sie haben ist die "classic" C LCG (
srand
/rand
), die nur erzeugt Reine integer-Verteilung im Bereich [0, MAX_RAND]; mit ihm können Sie erzeugen noch ein Gauß-Zufallszahlen anhand der Box-Muller-Transformation. (Es könnte nützlich sein, zu beachten, dass die C++11-GNU-GCC libstdc++'sstd::normal_distribution
verwendet die Polar-Marsaglia-Methode wie gezeigt hierin.).InformationsquelleAutor Matteo Italia