Problem mit Zufallszahlenfolge



  • Das waren waren bestimmt die mit den drei Buchstaben. 🙂



  • Ahm, warum ist std::random_shuffle (algorithm) konkret noch nicht genannt worden? wurde das ausgeschlossen?.
    Man kann ja auch nach jedem Zug alles nochmal durchshufflen, wenn man es zu "show" autenthisch braucht (warum auch immer?)

    Mit dem Predikat kann man auch jede random engine nehmen die man will.
    (mersenne twister, random device, linear congruential engine)



  • Tim06TR schrieb:

    Ahm, warum ist std::random_shuffle (algorithm) konkret noch nicht genannt worden?

    Wurde als uninteressant (Fischer-Yates) auf der ersten Seite abgetan.



  • Skym0sh0 schrieb:

    volkard schrieb:

    Vorschlag für kleine Ämderungen

    // ......
    
    		/*
            auto it = zahlen_zum_ziehen.begin() + zufallsindex;//hier kein -1
            zahlen_zum_ziehen.erase( it );
            */
            std::swap(zahlen_zum_ziehen[zufallsindex],zahlen_zum_ziehen[zahlen_zum_ziehen.size()-1]);
            zahlen_zum_ziehen.pop_back();
        }
    
        return 0;
    }
    

    Ich werfe an der Stelle einfach mal das Erase-Remove-Idiom ein, wobei das schon fast eher Overkill ist.

    Willst du wirklich für jede gezogene Zahl ne kopie vom array machen?



  • Kopiert wird doch nur, was hinter der gefundenen Zahl kommt. Und das wird mit C++11 sogar gemovet.

    Aber im Prinzip hast du recht und spiegelt auch genau meine Bedenken wieder: Remove-Erase ist zuviel des Guten. Bei kleinen Zahlenfolgen wird das zwar niemand merken, aber wenn es mehr wird dann können da schon Performanceeinbrüche kommen.



  • volkard schrieb:

    Ich leite es weiter an den, der das Serverpasswort hat.

    Danke für den Hinweis, ist behoben.



  • @Volkard,

    bei deinem Code, habe ich leider auch 2 dieselben Zahlen bekommen. Es tauchten 2x die 40 und später 2x die 26 auf. Ich habe eine do while Schleife eingebaut damit ich das Programm nicht immer neu starten muss. Bei deiner Version ist es ein wenig komplizierter für mich.



  • Sandor++ schrieb:

    @Volkard,
    bei deinem Code, habe ich leider auch 2 dieselben Zahlen bekommen. Es tauchten 2x die 40 und später 2x die 26 auf. Ich habe eine do while Schleife eingebaut damit ich das Programm nicht immer neu starten muss. Bei deiner Version ist es ein wenig komplizierter für mich.

    Zu unkonkret. Was heißt 2x die 40? In zwei aufeinanderfolgenden Ziehungen zu 6 Zahlen kam die 40 vor? Ja, kann doch sein.

    Zeig den Code,
    sag, was er macht,
    sag, inwiefern er es nicht macht,
    sag, was Du erwartest, was er macht.



  • volkard schrieb:

    Zeig den Code,

    Mache ich:

    #include <iostream>
    #include <random>
    #include <vector>
    #include <windows.h>
    
    using namespace std;
    int main()
    {
    	mt19937 engine;//nicht den fricken mt in einer innere Schleife für je eine Zahl
    	//konstruieren lassen.
    
    	vector<unsigned int> zahlen_zum_ziehen;
    
    	do{
    
    		for (unsigned int i = 1; i <= 49; ++i)
    			zahlen_zum_ziehen.push_back(i);
    
    		for (unsigned int i = 1; i <= 6; ++i)
    		{
    			unsigned int zufallsindex = uniform_int_distribution<unsigned int>(1, zahlen_zum_ziehen.size())(engine);
    
    			cout << "gezogene Zufallszahl: " << zahlen_zum_ziehen[zufallsindex] << endl;
    
    			swap(zahlen_zum_ziehen[zufallsindex], zahlen_zum_ziehen[zahlen_zum_ziehen.size() - 1]);
    			zahlen_zum_ziehen.pop_back();
    
    		}
    
    		Sleep(2000);
    		system("cls");
    	} while (true);
    
    	system("pause");
    	return 0;
    }
    

    volkard schrieb:

    sag, was er macht,
    sag, inwiefern er es nicht macht,
    sag, was Du erwartest, was er macht.

    Habe ich gesagt, hast du mich gehört?



  • Ähm ja also meine letzte Antwort sollte ein kleiner Gag gewesen sein. 🙂
    Also dass ist immer unterschiedlioch aber spätesten so nach dem 5. oder 6 Durchlauf habe ich diese Zahlenfolge: 6 12 40 8 40 5. Dann immer unteschiedliche und wieder: 8 20 6 20 12 19.
    Was ich erwarte ist das mein liebes Programmchen immer unterschiedliche Zahlen generiert und nicht 2 und 3 dieselben Zahlen in der 6er Ziehung. Geht das denn nicht?



  • Du solltest den vector in die do while Schleife packen. So wie es jetzt ist hast du immer noch Zahlen der vorhergehenden Ziehungen drin.



  • Tatsächlich manni, es klappt! Mein Gott auf wowas muss man kommen. Also ich habe riesen Respekt vor Programmierern die das können. Bis ich soweit bin dat kann ja noch bis Weihnachten dauern! 🙂



  • Das klappt jetzt zwar so aber leider muss ich euch eine traurige Mitteilung mitteilen: Und zwar bekomme ich eine Fehlermeldung, nach ca. 10 Sek.:

    Microsoft Visual C++ Runtime Library

    Debug Assertion Failed!

    Program: C:\Windows\sytem32\MSVCP120D.dll
    File c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector
    Line:1201

    Expression: vector subscript out of range

    For information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.
    (Press Retry to debug the application)

    Da bin ich schon überfordert!



  • Der Satz "Da bin ich überfordert" kam von mir nicht vom Windows.



  • Hast du retry gepresst?
    Dein index lauft von 1 bis 49, richtig wäre aber 0 bis 48.



  • manni66 schrieb:

    Hast du retry gepresst?
    Dein index lauft von 1 bis 49, richtig wäre aber 0 bis 48.

    Du das ist dann das selbe Problem! Ich denke ich lass das Thema mal beiseite denn dass ist schon für mich Hochschule. Ich kümmere mich um mein anderes Projekt. Mit der Lagerwaltung, was ich halt so kann.

    Danke


Anmelden zum Antworten