2016-04-08 6 views
-3

Also ich versuche, 10.000 Zufallszahlen von 1-100 zu generieren, aber es erzeugt nur bis zu 99 Zahlen, denn wenn ich es anzeigen kann ich nur von 1-99 sehen, es sei denn es ist mein Code, um es zu finden. Was passiert in meinem Code ist ich versuche zu finden, wie oft die Zahl generiert wird. Grundsätzlich eine Frequenz/Histogramm.randomizer erzeugt nur bis zu 99 C++

EDIT: Ich erzeuge 100, aber es ist nicht die Anzeige, i hier eine Fehlermeldung erhalten, ist mein Code:

vector<int> vint; 

for (int i = 0; i < 10000; i++) 
{ 
    int x = (rand() % 100) + 1; 
    vint.push_back(x); 
} 

frequency(vint); 

void frequency (vector<int> v1) 
{ 
int counter = 1; 
int max = 0; 
int mode = v1[0]; 
int numbercheck = 0; 
for (int pass = 0; pass < 10000-1 ; pass++) 
{ 
    if (v1[pass] == v1[pass + 1]) 
    { 
     counter++; 
     numbercheck++; 

    } 
    else 
    { 
     cout << v1[pass] << ": " << counter << "..................." << endl; 
     counter = 1; 

    } 
} 
+0

Ihr Code sieht gut aus, nur dass rand() 99 nicht generiert hat und somit Ihre Addition von 1 möglicherweise nicht funktioniert hat. Bitte erhöhen Sie die Größe und sehen Sie, ob Sie eine 100 bekommen. Hoppla! For-Schleife ist außerhalb der Funktion für die Generierung. – user902384

+0

Denken Sie daran, 'rand()' ist nicht sehr zufällig, wenn Sie kryptografische Zufallszahlen benötigen, sollten Sie einen besseren Generator verwenden. Sie sollten Werte im Bereich von 0 bis 99 mit diesem Code erhalten, +1 sollte es auf 1 bis 100 versetzen, aber Rollen 100 ist ein Ereignis 1 in 100. Sind Sie sicher, dass Sie genügend Daten generieren, um sicherzugehen, dass Sie nie 100 bekommen? Haben Sie die Verteilung Ihrer Zufallsfunktion getestet? – tadman

+1

Ihr Code wird nicht kompiliert, aber Sie könnten ihn leicht geschrieben haben, um ein eigenständiges, minimales funktionierendes Beispiel zu erstellen. Bitte bearbeiten Sie Ihren Code, damit er ohne Änderungen ausgeführt werden kann. – Richard

Antwort

2

Wenn Sie einen c++11 kompatible Compiler dann vermeiden werden mit dem Mersenne- mit rand() und verwenden Twister-Engine stattdessen für höhere Qualität zufällige Sequenzen. Hier ist ein Code-Snippet Beispiel:

#include <random> 

int main(void) { 
    std::random_device rd; // for random seed 
    std::seed_seq seed{rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()}; 
    std::mt19937 eng(seed); 

    const int min = 1; 
    const int max = 100; 

    // used to generate ints in interval [min,max] (inclusive) 
    std::uniform_int_distribution<int> dist(min,max); 

    int randomInt = dist(engine); // generate random int using dist and mtengine 

    return 0; 

} 

Sehen Sie diese (unterhaltsam) Video aus irgendwelchen Gründen auf, warum rand() ist schlecht:

https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

+2

Das ist eine viel bessere Herangehensweise an die Dinge. Nett! – tadman

+1

Wie haben Sie festgestellt, dass 'rand()' der Schuldige im OP-Code war? –

+0

Das beantwortet natürlich nicht die Frage, aber es zeigt den richtigen Weg, um Zufallszahlen zu generieren. – bames53

0

Sie sollten Erzbischöflichen Antwort akzeptieren. Hier ist ein einfacheres Programm für Sie.

#include <iostream> 
#include <vector> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    vector<int> vint; 

    for(int i=0; i<10000; ++i) 
    { 
     vint.push_back(rand()%100 + 1); 
    } 

    for(const auto&e: vint) 
     cout << e << endl; 

    return 0; 
} 

Es erzeugt für mich 100 aber für Sie vielleicht nicht erzeugen.

+0

Nein, er sollte ArchBishops Antwort nicht akzeptieren, da weder es noch dieser Code das Problem löst (wie bearbeitet ...). –

+0

Sein Code wird nicht kompilieren, da Schleife scheint fehl am Platz, der mein erster Kommentar zu der Frage war. Dieser Code dient nur als Beispiel. – user902384