Cplusplus Zufallszahlen



  • Sorry für die vielen Rechtschreibfehler fallen mir immer erst am Ende auf und dann ist es zu spät da ich mich noch angemeldet habe um diese zu ändern. :p



  • Skeptar schrieb:

    Nix da-hier genau so wollte ich es haben mit ein wenig erklärung und wenn geht in C++ da ich nicht weiß ob das :

    srand((unsigned)time(NULL)); // Zufallsgenerator initialisieren.
    

    der initialisierungswert bestimmt die zahlenfolge, die von der funktion rand geliefert wird.
    wenn du den selben initialisierungswert verwendest, bekommst du dieselbe zahlenfolge.
    hier wird mit einem zahlenwert initialisiert, der von der funktion time geliefert wird.
    die funktion time liefert die anzahl der vergangenenen sekunden seit 1970.
    http://www.cplusplus.com/reference/ctime/time/

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(void)
    {
    	srand(1); // Zufallsgenerator mit 1 initialisieren.
    	for ( int i = 0; i < 10; i++ )
    		cout << rand() << endl;
    
    	srand(1); // Zufallsgenerator mit 1 initialisieren.
    	for ( int i = 0; i < 10; i++ )
    		cout << rand() << endl;
    
    	// Es wurde zweimal mit dem selben Wert initialisiert, daher wurde 'zufällig' zweimal dieselbe
    	// Zahlenfolge ausgegeben.
    
    	srand((unsigned)time(NULL)); // Zufallsgenerator mit den seit 1970 vergangenen Sekunden initialisieren.
    
        do
        {
            cout << "Willst du eine Zufallszahl sehen? Dann druecke Enter." << endl;
    		if ( '\n' == cin.get())
    			cout << rand() << endl;
            else 
                break;
        } while(true);
        return 0;
    }
    


  • Also wenn ich das nun richtig verstehe würde dies:

    srand(1); // Zufallsgenerator mit 1 initialisieren.
        for ( int i = 0; i < 10; i++ )
    

    ausreichen um eine Zufallszahl zu generieren.
    Wenn ja könntest du mir das eventuell etwas deutlicher erklären warum dort eine Schleife und wie kann man das einstellen das eine Zahl zwischen z.B. 1 und 100 generiert wird?.

    Skeptar



  • Skeptar schrieb:

    Also wenn ich das nun richtig verstehe würde dies:

    srand(1); // Zufallsgenerator mit 1 initialisieren.
        for ( int i = 0; i < 10; i++ )
    

    ausreichen um eine Zufallszahl zu generieren.
    Wenn ja könntest du mir das eventuell etwas deutlicher erklären warum dort eine Schleife und wie kann man das einstellen das eine Zahl zwischen z.B. 1 und 100 generiert wird?.

    Skeptar

    die schleife hat nichts mit der initialisierung zu tun, in der schleife werden lediglich die zahlen ausgegeben.
    zur erzeugung der zahlen brauchst du srand auch nicht, aber das hat ja seppj schon recht ausführlich erklärt.
    für das einstellen der zahlen zwischen 1 und 100 wird dir gleich jemand ein beispiel posten, sonst mach ich das später nach dem essen.



  • Stephan T. Lavavej hat erst kürzlich einen kurzen 30 minuten vortrag gehlaten, über zufallszahlen
    fand ich sehr informativ

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



  • zufallszahlen zwischen 1 und 100(erster googletreffer fuer "c++ rand()"^^)

    rand() % 100 + 1;
    


  • und der Link über dir sagt dir schon, dass das nicht korrekt ist 😉

    int maxUsable = RAND_MAX - RAND_MAX%100;
    int number = 0;
    do{
        number = rand();
    }while(number > maxUsable);
    number = number % 100+1;
    


  • keine lust mir das vid anzugucken, aber

    int main()
    {
    	int nummer;
    	for(long i=0;i<10000000;i++)
    	{
    		nummer=rand()%100+1;
    		if (nummer>100 || nummer<1) cout<<"otze hat recht";
    
    	}
    }
    

    😃



  • Und dann noch mal in "richtig": 🤡

    #include <array>
    #include <algorithm>
    #include <random>
    #include <iostream>
    
    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';
    }
    


  • Modulo ist oft gut genug.



  • bert0 schrieb:

    keine lust mir das vid anzugucken

    merkt man. Modulo gibt dir keine Gleichverteilung.

    @cooky451

    std::mt19937 create_seeded_rng()
    {
        std::random_device rd;
        return std::mt19937(rd);
    }
    


  • Leute....
    es ist ja nett das ihr so viele Antworten schreibt,
    aber ihr vergesst das entscheidene, dass ich neu in C++ bin 😃
    Ich wollte eigentlich nur eine Zufallszahl in einer Variable speichern um daraus ein Ratespiel zu erstellen..... .
    Also geht das alles noch viel einfacher`??? 😃

    Skeptar



  • @otze Ich glaube nicht dass man dem nen Generator als seed-seq geben kann?



  • Er meinte ja auch

    return std::mt19937(rd());
    

    Ich hoffe cooky kann Flüchtigkeitsfehler erkennen.



  • Skeptar schrieb:

    Leute....
    es ist ja nett das ihr so viele Antworten schreibt,
    aber ihr vergesst das entscheidene, dass ich neu in C++ bin 😃
    Ich wollte eigentlich nur eine Zufallszahl in einer Variable speichern um daraus ein Ratespiel zu erstellen..... .
    Also geht das alles noch viel einfacher`??? 😃

    Skeptar

    Wie schon gesagt:

    #include <cstdlib>
    #include <ctime>
    ...
    srand(time(NULL)); // anfang der main
    ...
    int rand_nr = rand() % (max - min) + min;
    


  • Sone schrieb:

    Ich hoffe cooky kann Flüchtigkeitsfehler erkennen.

    Ehm na ja gut, es gibt schon einen Grund warum seed_seq existiert, und der ist zufälligerweise ziemlich genau mt19937.



  • cooky451 schrieb:

    Sone schrieb:

    Ich hoffe cooky kann Flüchtigkeitsfehler erkennen.

    Ehm na ja gut, es gibt schon einen Grund warum seed_seq existiert, und der ist zufälligerweise ziemlich genau mt19937.

    ja, sorry 🙂 ich hatte da wohl den Talk falsch verstanden. Ich dachte - und es klang intuitiv logisch - dass man nen random_device als seed_seq übergeben könnte.



  • Leidet die Zufallszahlenqualität des mt19937 annähernd messbar durch den kleineren Seed?


  • Mod

    Ethon schrieb:

    Leidet die Zufallszahlenqualität des mt19937 annähernd messbar durch den kleineren Seed?

    Ja.



  • cooky451 schrieb:

    Sone schrieb:

    Ich hoffe cooky kann Flüchtigkeitsfehler erkennen.

    Ehm na ja gut, es gibt schon einen Grund warum seed_seq existiert, und der ist zufälligerweise ziemlich genau mt19937.

    Davon redete ich gar nicht. Ich dachte, Onkel otze hatte aus Versehen die Klammern vergessen...


Anmelden zum Antworten