Zufallszahl generieren.



  • Hallo C++ Community,

    Ich bin recht neu und möchte wissen wie ich Zufallszahlen generieren lassen kann.
    Diesen Script habe ich aus dem Internet.
    Nun zu meiner Frage, was kann ich alles mit diesem Script machen also z.B. in dem Klammern bei rand() alles schreiben? Und was hat es mit srand (time(NULL)) auf sich? Was bedeuten diese Wörter übersetzt.
    Wie kann ich z.B. wenn eine bestimme Zahl generiert wird einen Satz ( Handlung ) ausgeben lassen? Und wie bekomme ich das so hin das nur die Zahlen 1 - 3 generiert werden?

    #include <iostream>
    
    int main ()
    {
    
      srand (time(NULL));
      std::cout << "Random number:" << rand()%100 << std::endl;
    
      system("PAUSE");
      return 0;
    }
    

    Ich bedanke mich für jede hilfreiche Antwort!

    MfG



  • Gibt es einen Script der Zahlen generiert ohne rand etc. zu benutzen?
    Sry für die ganzen Fragen 😃



  • Chechen65 schrieb:

    Gibt es einen Script der Zahlen generiert ohne rand etc. zu benutzen?

    Definiere etc! Rand und ihre Artverwandten sind natürlich irgendwie implementiert. Wer dumm genug ist kann das auch selber machen. Ansonsten: wie währe es mit Dokumentation lesen?



  • manni66 schrieb:

    Definiere etc! Rand und ihre Artverwandten sind natürlich irgendwie implementiert. Wer dumm genug ist kann das auch selber machen. Ansonsten: wie währe es mit Dokumentation lesen?

    Gib mir doch eine nützliche Link wenn du dir Schreibarbeit ersparen willst.



  • Chechen65 schrieb:

    Gibt es einen Script der Zahlen generiert ohne rand etc. zu benutzen?
    Sry für die ganzen Fragen 😃

    Ja!

    #include <random>
    
    std::random_device rd;
    std::cout << rd() << std::endl;
    
    // oder
    // http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
    


  • Stehen die Antworten auf deine Fragen nicht in deinen Büchern, die du ja hast (http://www.c-plusplus.net/forum/p2390012#2390012)
    Wenn nein, schmeiss sie weg. Wenn doch, dann lies sie gründlich durch.



  • http://en.cppreference.com/w/

    std::mt19937 create_seeded_rng() 
    { 
        std::random_device rd; 
        std::array<std::mt19937::result_type, std::mt19937::state_size> seed_data; 
        std::generate(seed_data.begin(), seed_data.end(), std::ref(rd)); 
        std::seed_seq seq(seed_data.begin(), seed_data.end()); 
        return std::mt19937(seq); 
    } 
    
    int main() 
    { 
        std::mt19937 rng = create_seeded_rng(); 
        std::uniform_int_distribution<int> dist(0, 100);
    
        for (unsigned i = 0; i != 100; ++i) 
            std::cout << dist(rng) << '\n'; 
    }
    

    Gibt "zufällige" Zahlen zwischen 0 und 100 aus.



  • std::mt19937 create_seeded_rng() 
    { 
        std::random_device rd; 
        std::array<std::mt19937::result_type, std::mt19937::state_size> seed_data; 
        std::generate(seed_data.begin(), seed_data.end(), std::ref(rd)); 
        std::seed_seq seq(seed_data.begin(), seed_data.end()); 
        return std::mt19937(seq); 
    } 
    
    int main() 
    { 
        std::mt19937 rng = create_seeded_rng(); 
        std::uniform_int_distribution<int> dist(0, 100);
    
        for (unsigned i = 0; i != 100; ++i) 
            std::cout << dist(rng) << '\n'; 
    }
    

    Damit kann ich nichts anfangen.



  • ist Chechen65 der neue frühlingstroll? 🙂



  • Jetzt siehst du mal den Unterschied zwischen C mit cout (das Programm das du gepostet hast) und modernen C++.

    Hast du den Link aus der ersten Zeile des Posts von cooky451 verfolgt?



  • Ich weis nicht was euer Problem ist 😞
    Man kann einfach keine normal Antwort hier erwarten.

    Wenn ich sage das ich ein Anfänger bin. Dann muss man damit rechnen das ich nicht mit so einem Script klar komme.

    Ich schaue mir gerade die Seite an.



  • DirkB schrieb:

    Jetzt siehst du mal den Unterschied zwischen C mit cout (das Programm das du gepostet hast) und modernen C++.

    Jo, 2 Zeilen C == 17 Zeilen C++.



  • unterscheider schrieb:

    DirkB schrieb:

    Jetzt siehst du mal den Unterschied zwischen C mit cout (das Programm das du gepostet hast) und modernen C++.

    Jo, 2 Zeilen C == 17 Zeilen C++.

    Genau das hab ich mit auch gedacht.
    Modernes C++ macht alles komplexer.



  • Vereinfachen wir das mal.

    int main()
    {
        std::mt19937 rng(time(NULL));//initialisiere einen Zufallszahlengenerator mit namen rng mit dem seed der aktuellen zeit.
        std::uniform_int_distribution<int> dist(0, 100);//dist stellt gleichverteilte Zufallszahlen zwischen 0 und 100 dar. Aufpassen: die 100 ist auch drin.
    
        for (unsigned i = 0; i != 100; ++i)
            std::cout << dist(rng) << '\n';//benutze den rng um eine Zufallszahl zwischen 0 und 100 zu erzeugen.
    }
    

    Der Rest von cooky war so Profi zeugs, welches die meisten Leute nicht brauchen 🤡



  • Chechen65 schrieb:

    Und wie bekomme ich das so hin das nur die Zahlen 1 - 3 generiert werden?

    rand()%3 ergibt Zahlen 0-2
    rand()%3+1 ergibt Zahlen 1-3



  • als würde man das so direkt gegenüber stellen können...
    die zufallszahlen aus dem mersenne twister sind viel besser als die mit einem kongruenzgenerator + modulo. wenn man monte carlo simulationen macht, dann wird man das schon merken.



  • asfdlol schrieb:

    als würde man das so direkt gegenüber stellen können...
    die zufallszahlen aus dem mersenne twister sind viel besser als die mit einem kongruenzgenerator + modulo. wenn man monte carlo simulationen macht, dann wird man das schon merken.

    Nö, eigentlich nicht. Wer an die Ausnahmen gerät, der wird eh schon seinen Lieblingsgenerator aussuchen gefunden haben.

    Ich denke nicht, daß es schon polizeilich verboten wäre, daß Chechen65 und ich gerne rand() benutzen.



  • volkard schrieb:

    asfdlol schrieb:

    als würde man das so direkt gegenüber stellen können...
    die zufallszahlen aus dem mersenne twister sind viel besser als die mit einem kongruenzgenerator + modulo. wenn man monte carlo simulationen macht, dann wird man das schon merken.

    Nö, eigentlich nicht. Wer an die Ausnahmen gerät, der wird eh schon seinen Lieblingsgenerator aussuchen gefunden haben.

    Ich denke nicht, daß es schon polizeilich verboten wäre, daß Chechen65 und ich gerne rand() benutzen.

    nein, verboten ist es logisch nicht, lol.
    du nutzt direkt rand() für alle viele (edit 3, zu doof das geschriebene richtig zu interpretieren) anwendungen? wusste ich nicht. ich glaubte mal aus einem anderen thread aufgeschnappt zu haben, dass du eine modifizierte multiply-with-carry-version nimmst.

    edit: ich wollte mich nur gegen die aussage wehren, dass c++ sinnlos verkompiziert. dabei bieten die c++11 prngs viel mehr möglichkeiten.

    edit 2: in spielen oder so was nutze ich auch rand(), gar keine frage.



  • DirkB schrieb:

    Jetzt siehst du mal den Unterschied zwischen C mit cout (das Programm das du gepostet hast) und modernen C++.
    Hast du den Link aus der ersten Zeile des Posts von cooky451 verfolgt?

    Der ist in dem Kontext ungefähr so sinnvoll wie

    "
    Ich hab Die mal eine Zusammenstellung der wichtigsten Buchstaben gesucht, damit kannste Dir die richtigen Antworten dann selber zusammenbauen: http://us.123rf.com/400wm/400/400/artenot/artenot0909/artenot090900131/5521213-isolated-cartoon-color-plasticine-alphabet-on-a-white-background.jpg
    "



  • asfdlol schrieb:

    du nutzt direkt rand() für alle anwendungen?

    Nicht für alle.

    asfdlol schrieb:

    ich glaubte mal aus einem anderen thread aufgeschnappt zu haben, dass du eine modifizierte multiply-with-carry-version nimmst.

    Jo, sobald rand nicht mehr reicht.

    asfdlol schrieb:

    edit 2: in spielen oder so was nutze ich auch rand(), gar keine frage.

    Genau, meine ich doch. Gut zu wissen, daß im Standard-C++ auch die Kanonen zu finden sind.


Log in to reply