2016-09-29 6 views
1

Ich versuche, qualitativ hochwertige Zufallszahlen im Bereich (0,1) in meinem Projekt zu generieren, und ich habe versucht, die uniform_real_distribution aus einem Beispielcode von here testen. Als ich ihm den Code lief es funktionierte gut, aber wenn ich mit Impfen des Generators, das gleiche zu ändern versuche, wie:uniform_real_distribution gibt keine gleichmäßige Verteilung

#include <random> 
#include <iostream> 
#include <chrono> 

using namespace std; 
// obtain a seed from the system clock: 
unsigned seed = static_cast<int> (chrono::system_clock::now().time_since_epoch().count()); 

// globally defining the generator and making it static for safety because in the 
// actual project this might affect the flow. 

static default_random_engine gen(seed); 
uniform_real_distribution<double> distribution(0.0,1.0); 

int main(){ 
    const int nrolls=10000; // number of experiments 
    const int nstars=95;  // maximum number of stars to distribute 
    const int nintervals=10; // number of intervals 

    int p[nintervals]={}; 

    for (int i=0; i<nrolls; ++i) { 
    double number = distribution(gen); 
    ++p[int(nintervals*number)]; 
    } 

    std::cout << "uniform_real_distribution (0.0,1.0):" << std::endl; 
    std::cout << std::fixed; std::cout.precision(1); 

    for (int i=0; i<nintervals; ++i) { 
    std::cout << float(i)/nintervals << "-" << float(i+1)/nintervals << ": "; 
    std::cout << std::string(p[i]*nstars/nrolls,'*') << std::endl; 
    } 

    return 0; 

} 

Die Zufallszahlen wurden nicht gleichmäßig verteilt ist. Der Ausgang desselben, wenn sie ausgeführt wird wiederholt:

F: \ path> randtest

uniform_real_distribution (0.0,1.0):

0,0-0,1: *********

0.1-0.2: **********

0.2-0.3: ********

0.3-0.4: ******** *

0.4-0.5: *********

0.5-0.6: *********

0.6-0.7: ******** *

0.7-0.8: *********

0.8-0.9: *********

0.9-1.0: ******* ***

F: \ Pfad> Randtest

uniform_real_distribution (0.0,1.0):

0.0-0.1: *********

0.1-0.2: *********

0.2- 0,3: *********

0.3-0.4: *********

0.4-0.5: *********

0,5 -0,6: *********

0.6-0.7: *********

0.7-0.8: *********

0.8-0.9: *********

0,9-1,0: *********

F: \ path> randtest

uniform_real_distribution (0.0,1.0):

0,0-0,1: **** *****

0.1-0.2: *********

0.2-0.3: *********

0,3-0,4: *********

0,4-0,5: **********

0,5-0,6: *********

0.6-0.7: *********

0.7-0.8: *********

0,8-0,9: *********

0.9-1.0: *********

Liegt es an der Aussaat? Oder ist es besser, einen anderen Generator zu verwenden?

Ich benutze G ++ 5.1.0 Compiler C++ 11 Standards.

+4

Das sieht ziemlich einheitlich für mich aus. Erwarten Sie, dass die Ergebnisse jedes Mal perfekt gleichmäßig verteilt werden? –

+0

Ja. Diese Funktion wird als Mehrfachzeit bezeichnet und jedes Ergebnis wird miteinander verglichen. Gibt es also eine Möglichkeit, es perfekt zu verteilen? – akki

+2

Konsultieren Sie einen Statistiker, wenn das für Sie sehr wichtig ist, aber ich schätze, Ihre Stichprobe ist zu klein. Wenn ich 'nrolls 'um 10X vergrößere, bekomme ich eine visuell einheitliche Verteilung. – RegularlyScheduledProgramming

Antwort

9

Wenn Sie eine Münze einmal umgedreht und es landete Köpfe, wäre es immer auf Schwänze landen Sie das nächste Mal es geklappt?

Eine Münze erzeugt eine gleichmäßige Verteilung auf die Menge {heads, tails}. Das bedeutet nicht, dass die Anzahl der Köpfe und Schwänze für einen Satz von Flips gleich ist. In der Tat, die Chance, dass passiert genau geht runter wie Sie mehr Münzen Flip.

In Ihrem Fall jedes dieser Intervalle hat eine Chance von 10%, ausgewählt zu werden.

die Varianz einer solchen Auswahl ist (0,1) (1 bis 0,1) oder 0,09.

Der erwartete Wert ist 0,1.

nach 10000 Versuche, der erwartete Wert sein wird 1000.

Tha Varianz 900.

900 Varianz entspricht einer Standardabweichung von 30

Die 95- sein wird, ish% Konfidenzintervall ist 2 Standardabweichungen (eigentlich 1,96, aber wen interessiert das).

So sollten Sie die Werte erwarten typischerweise zwischen 940 und 1060.

Mit 95 Sternen sein, jeder Stern entspricht 10000/95 = 105 Elemente.

940/105 beträgt ca. 8,95 1060/105 ca. 10.06

ist So werden Sie in der Regel auf jeder Spalte zwischen 8 und 10 Sterne sehen. Unter der Annahme, dass das Abrunden erfolgt, sollte das Schlagen von 7 oder 11 Sternen selbst bei 10 anti-korrelierten Proben sehr selten sein (da das 3 SD weg ist).

Dies alles geht von einer perfekten gleichmäßigen Zufallsverteilung aus. Wie dies Ihr beobachtetes Verhalten modelliert, ist Ihr Problem mit der Mathematik und der Definition von zufällige Verteilung, nicht die C++ Sprache.

Wenn Sie ein perfektes Histogramm wollen, keine einheitliche statistische Verteilung verwenden. Sie können beispielsweise einfach mit 0 beginnen und dann jedes Mal 0,0001 hinzufügen. Nach 10001 Aufrufen haben Sie ein einheitliches Histogramm von 0 bis 1.

Uniform zufällig bedeutet einfach die Chance für jede Region ist die gleiche.

+1

http://onlinestatbook.com/2/calculators/normal_dist.html sagt normal = 1000, sd = 30, Bereich = 945-1050 -> 91,88% sollte 9 Sterne haben. 3,334% mit 8 Sternen und 4,78% mit 10 Sternen. Dies scheint seinen Beispielen recht gut zu entsprechen –

+0

@Yakk danke für die Erklärung. und es ist wahr, dass ich neu in diesem thema der mathematik bin, ihre antwort hat mir geholfen, besser zu verstehen. – akki

Verwandte Themen