2017-05-13 1 views
0

Helo da! Ich fange gerade an, in C++ zu kodieren, und ich bin nicht sicher, wie man Zufallszahlengeneratoren richtig verwendet. Zum Beispiel brauche ich Nummern aus dem Bereich [0,30000], um sicherzustellen, dass ich nicht nur kleine Zahlen aus meinem Bereich bekomme. Meine Funktion:mt19937 und Normalverteilung

std::random_device rd; 
std::mt19937 rng(rd()); 
int myRand(int i) { 
    std::normal_distribution<double> distribution(30, 1500); 
    double temp=distribution(rng); 
    if(temp<0){ 
     temp*=(-1); 
    } 
    return (int) std::round(temp)%i; 
} 

Würden Sie bitte hilft mir normal_distribution richtig zu konfigurieren?

+0

Das ist eine wirklich wirklich seltsame Distribution, die Sie dort berechnen. Was ist die beabsichtigte Verteilung? – harold

+0

Ganz ehrlich zu Ihnen, ich habe diese Verteilung auf einer Website gefunden. Alles, was ich brauche, sind viele Zahlen aus [0, n]. Jede Zahl sollte dieselbe Wahrscheinlichkeit haben, ausgewählt zu werden. – ogarogar

+2

Das ist eingebaut, siehe 'uniform_int_distribution'. – harold

Antwort

4

Der Begriff "Normalverteilung" bedeutet keine "regelmäßige Verteilung". Es bedeutet eine normal distribution, wie von der Mathematik definiert. Das ist nicht was du willst.

Was Sie suchen, ist eine uniform_real_distribution, die Schwimmer in einem bestimmten Bereich ausspuckt. Dies geschieht jedoch nur in einem halboffenen Bereich.

std::uniform_real_distribution<double> distribution(0, 30000); 
double temp=distribution(rng); 

Dies kann 0 zurückgeben, aber es wird nie 30000.

zurück, wenn Sie ganze Zahlen über einen geschlossenen Bereich wollen, können Sie uniform_int_distribution verwenden.

+3

Es sollte betont werden, dass 'uniform_int_distribution' einen geschlossenen Bereich hat. – juanchopanza

Verwandte Themen