Lottozufallszahlen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Lottozufallszahlen

    hi soll ein Programm schreiben, welches zufällige Lottozahlen ausgibt. Und zwar in der Form:

    Quellcode

    1. z.B. gewürfelt: 14 34 16 20 43 2
    2. Ausgabe: 1 X 3 4 5 6 7
    3. 8 9 10 11 12 13 X
    4. 15 X 17 18 19 X 21
    5. 22 23 24 25 26 27 28
    6. 29 30 31 32 33 X 35
    7. 36 37 38 39 40 41 42
    8. X 44 45 46 47 48 49


    Mein Quelltext bisher:

    Quellcode

    1. #include <iostream>
    2. #include <cstdlib>
    3. using namespace std;
    4. int main ()
    5. {
    6. char eingabe;
    7. int durchlauf=0;
    8. int zufall;
    9. srand(1);
    10. Schleife:
    11. while (durchlauf<7 && durchlauf>=0)
    12. {
    13. zufall = rand();
    14. if ((zufall<50) && (zufall>0))
    15. {
    16. cout << "Zufallszahl: " << zufall << endl;
    17. durchlauf=durchlauf+1;
    18. }
    19. else goto Schleife;
    20. }
    21. system("pause");
    22. return 0;
    Alles anzeigen


    Warum gibt das Programm bei jedem Durchlauf die gleichen "Zufallszahlen" aus? So zufällig scheinen die ja nicht zu sein... mit der Formatierung habe ich noch Probleme, und ich weiß nicht genau, wie ich es ausschließen kann, dass nicht 2 mal die selbe Zahl unter den 6 gewürfelten ist. Ich könnte natürlich mit case versuchen die Zahlen zu vergleichen, hmmm...
  • hab mal noch ne Ecke weitergedacht:


    Quellcode

    1. #include <iostream>
    2. #include <cstdlib>
    3. using namespace std;
    4. int main ()
    5. {
    6. int eingabe;
    7. int Zahlen[6];
    8. int durchlauf=0;
    9. int zufall;
    10. int i=0;
    11. char Wert='0';
    12. cout << "Zahl eingeben" << endl;
    13. cin >> eingabe;
    14. srand(eingabe);
    15. Schleife:
    16. while (durchlauf<7 && durchlauf>=0)
    17. {
    18. zufall = rand();
    19. for (int k=0; k<6; k++)
    20. {
    21. if (Wert='0')
    22. {
    23. if (Zahlen[k]==zufall)
    24. {
    25. Wert='1';
    26. }
    27. }
    28. }
    29. if ((zufall<50) && (zufall>0))
    30. {
    31. Zahlen[i]=zufall;
    32. cout << "Zufallszahl: " << zufall << endl;
    33. durchlauf=durchlauf+1;
    34. i++;
    35. }
    36. else goto Schleife;
    37. }
    38. system("pause");
    39. return 0;
    40. }
    Alles anzeigen



    Ja wir sollen das so machen, dass der Nutzer ne Zahl eingibt! Das Problem bleibt wie es ist, wennd er Nutzer ne 1 eingibt, ist die 28 zwei mal vertreten unter den 6 Zahlen... :?

    EDIT: wegend er Formatierung mache ich das dann mit den Arrays (hoffe ich)
  • Quellcode

    1. #include <iostream>
    2. #include <cstdlib>
    3. using namespace std;
    4. int main (int argc, char** argv)
    5. {
    6. unsigned int eingabe;
    7. int Zahlen[6] = {0,0,0,0,0,0};
    8. int zufall;
    9. int i=0;
    10. cout << "Zahl eingeben" << endl;
    11. cin >> eingabe;
    12. srand(eingabe);
    13. while (i<6)
    14. {
    15. zufall = rand () % 50;
    16. for (int k = 0; k < 6; k++)
    17. if (Zahlen[k] == zufall)
    18. {
    19. zufall = 0;
    20. break;
    21. }
    22. if ((zufall<50) && (zufall>0))
    23. {
    24. Zahlen[i] = zufall;
    25. cout << "Zufallszahl: " << zufall << endl;
    26. ++i;
    27. }
    28. }
    29. system ("pause");
    30. return 0;
    31. }
    Alles anzeigen
  • "phax" schrieb:

    char** deklariert ein Zeiger auf einen Zeiger auf ein char was soviel heißt wie ein Array von Strings.
    So wird per Konvention "main" deklariert - dass kannst du dir gleich angewöhnen :)

    % ist der Modulo-Operator und sagt das alle Zahlen zwischen 0-49 liegen müssen.


    kann man das auch ohne das % machen? Ich probier mal aus deinem und meinem ne Zwischenlösung zu bauen. Und dann muss ich noch die Zahlen im Lottoscheinformat ausgeben, das wird ein Spaß :shock:
  • Ist es wo besser zu verstehen:

    Quellcode

    1. #include <iostream>
    2. #include <cstdlib>
    3. using namespace std;
    4. int main (int argc, char** argv)
    5. {
    6. unsigned int eingabe;
    7. int Zahlen[6];
    8. int zufall;
    9. int i=0;
    10. cout << "Zahl eingeben" << endl;
    11. cin >> eingabe;
    12. srand(eingabe);
    13. while (i<6)
    14. {
    15. zufall = rand ();
    16. for (int k = 0; k < 6; k++)
    17. if (Zahlen[k] == zufall)
    18. {
    19. zufall = 0;
    20. break;
    21. }
    22. if ((zufall<50) && (zufall>0))
    23. {
    24. Zahlen[i] = zufall;
    25. cout << "Zufallszahl: " << zufall << endl;
    26. i++;
    27. }
    28. }
    29. system ("pause");
    30. return 0;
    31. }
    Alles anzeigen
  • Hi,
    in deiner ersten Version hast du ja wieder mit goto´s rumgewerkelt.
    Wirklich,das solltest du dir erst garnicht angewöhnen.
    Tue einfach so als wenn es goto nicht geben würde!
    Naja,hier ist auch noch ne Programmversion von mir.
    Ich benutze darin allerdings nen std::set weil es einfach praktischer ist.

    Quellcode

    1. #include <iostream>
    2. #include <set>
    3. #include <cstdlib>
    4. #include <time.h>
    5. int main()
    6. {
    7. std::set<short> zahlen;
    8. srand(static_cast<int>(time(NULL)));
    9. while(zahlen.size()<6)
    10. zahlen.insert(rand()%49 + 1);
    11. for(int idx=1;idx<=49;++idx)
    12. {
    13. std::cout.width(2);
    14. if(zahlen.find(idx)!= zahlen.end())
    15. std::cout<<'X'<<' ';
    16. else
    17. std::cout<<idx<<' ';
    18. if(!(idx%7))
    19. std::cout<<'\n';
    20. }
    21. return 0;
    22. }
    Alles anzeigen


    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • hallo void!

    ja du hast Recht, wieder Gotos. Ich finde die einfach super praktisch, ich verstehe nicht was alle gegen Sprungmarken haben?

    Deinen Quelltext verstehe ich mal wieder nicht so ganz, bei dir ist immer alles so kompakt :roll:
    Kannst du mir mal erklären warum die rand() bei der gleichen Zahl in der Klammer also zB rand(1) immer das gleiche ausgibt? Das ist totaler Mist. Ich weiß auch immernoch nicht wie ich das mit der Formatierung dann lösen soll. Naja morgen abwarten ;)

    Morgen werde ich mir deinen Quelltext nochmal genauer ansehen, aber ich sehe schon, da sind wieder Sachen drin, die ich nicht kenne :roll:

    Achja: Das std::set was soll das? wozu ist das gut? Warum ist das praktisch? Wenn du

    Quellcode

    1. using namespace std;
    schreiben würdest, könnte man sich doch das std:: vor jedem cout und cin sparen...

    Gruß,

    cewbie
  • "cewbie" schrieb:

    hallo void!

    ja du hast Recht, wieder Gotos. Ich finde die einfach super praktisch, ich verstehe nicht was alle gegen Sprungmarken haben?

    Unbedingte Sprünge erschweren es in größeren Programmen ungemein den Zustand der Daten im Auge zu behalten.

    "cewbie" schrieb:


    Kannst du mir mal erklären warum die rand() bei der gleichen Zahl in der Klammer also zB rand(1) immer das gleiche ausgibt? Das ist totaler Mist.

    Naja,letztendlich ist srand/rand auch nur nen Algorithmus.Bei gleicher Eingabe gibt es immer die gleiche Ausgabe.So sonderlich kreativ sind CPU´s numal nicht :wink: .


    "cewbie" schrieb:

    Ich weiß auch immernoch nicht wie ich das mit der Formatierung dann lösen soll. Naja morgen abwarten ;)

    Die kannst du nahezu 1:1 von mir übernehmen.Was du halt in deiner Version anpassen musst,ist die Überprüfung ob die aktuelle Zahl eine der gewürfelten ist.
    Das ist in meinem Code die Stelle mit if(zahlen.find(idx) != zahlen.end())

    "cewbie" schrieb:


    Achja: Das std::set was soll das? wozu ist das gut? Warum ist das praktisch?

    std::set ist ein STL Container.Stell dir set momentan einfach als Box vor in die du beliebig viele Werte reinpacken kannst.Davon bietet die STL diverse an,die alle ihre Eigenarten,Vor- und Nachteile haben.Der richtige STL Container zur richtigen Zeit erleichtert einem das Leben ungemein :wink:.
    In diesem Fall bietet sich set an weil set keine doppelten Werte zulässt.
    Durch die bedingte Schleife while(zahlen.size()<6) wird solange versucht,mit rand erzeugte Zufallszahlen in den Container einzufügen bis dieser 6 Elemente enthält.
    Diese sind dann garantiert unterschiedlich.
    Wenn ich dir nen wirklich gutes C++ Einsteigerbuch empfehlen darf,dann ist das "C++ Einführung und professionelle Programmierung" von Ulrich Breymann.
    Darin wird auch recht ausführlich auf die STL eingegangen.Momentan fehlt dir aber noch Grundwissen um dich direkt (ernsthaft) mit der STL auseinanderzusetzen.
    Im ersten Thread im C/C++ Bereich hab ich nen Link zu nem speziellen STL Buch von Uli B. gepostet.

    "cewbie" schrieb:


    Wenn du

    Quellcode

    1. using namespace std;
    schreiben würdest, könnte man sich doch das std:: vor jedem cout und cin sparen...


    Ja das stimmt.Ist aber Gewohnheitssache.
    Im Allgemeinen sollte man es nämlich vermeiden in Headerdateien (von Klassen) Angaben über den zu benutzenden Namensraum zu machen,und somit den Namensraum dem potentiellen Benutzer einer Klasse aufzuzwängen.
    Hier ist natürlich von Klassen weit und breit keine Spur,und somit dein Einwand auch berechtigt,aber wenn man sich erstmal angewöhnt hat immer std vor die Standardklamotten zu setzen.....

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • Quellcode

    1. #include <iostream>
    2. #include <cstdlib>
    3. using namespace std;
    4. int main ()
    5. {
    6. unsigned int eingabe;
    7. int Zahlen[6];
    8. int zufall;
    9. int a=0;
    10. int lotto[48];
    11. int L=0;
    12. cout << "Dieses Programm bestimmt Lottozufallszahlen (6 aus 49)" << endl;
    13. cout << "" << endl;
    14. cout << "Zahl eingeben: " << endl;
    15. cin >> eingabe;
    16. srand(eingabe);
    17. while (a<6)
    18. {
    19. zufall = rand ();
    20. for (int b = 0; b < 6; b++)
    21. if (Zahlen[b] == zufall)
    22. {
    23. zufall = 0;
    24. break;
    25. }
    26. if ((zufall<50) && (zufall>0))
    27. {
    28. Zahlen[a] = zufall;
    29. cout << "Zufallszahl: " << zufall << endl;
    30. a++;
    31. }
    32. }
    33. while (L<49) // 49 Zahlen ausgeben, wenn Zufallszahlen, dann statt der Zahl "0" ausgeben
    34. {
    35. lotto[L]=L+1;
    36. if (lotto[L])==(Zahlen[0] || Zahlen[1] || Zahlen[2] || Zahlen[3] || Zahlen[4] || Zahlen[5])
    37. {
    38. lotto[L]=0;
    39. }
    40. cout << " " << lotto[L] << " ";
    41. L=L+1;
    42. }
    43. system ("pause");
    44. return 0;
    45. }
    Alles anzeigen


    Kann mir jemand sagen warum das Programm die letzte Schleife nicht ausführt? Sie soll, wenn die Zufallszahl bestimmt ist, ebendiese als "0" ausgeben. (Mit X geht nicht, da integer Datentyp!)
  • Du hast in Zeile 40 einen Compilerfehler - falsche Klammernsetzung!
    Wahrscheinlich sucht du so was:

    Quellcode

    1. while (L<49) // 49 Zahlen ausgeben, wenn Zufallszahlen, dann statt der Zahl "0" ausgeben
    2. {
    3. lotto[L]=L+1;
    4. for (a = 0; a < 6; a++)
    5. if (lotto[L] == Zahlen[a])
    6. {
    7. lotto[L]=0;
    8. break;
    9. }
    10. if (lotto[L] < 10)
    11. cout << " " << lotto[L];
    12. else
    13. cout << " " << lotto[L];
    14. L++;
    15. if ((L % 7) == 0) // Neue Zeile nach 7 Zahlen
    16. cout << endl;
    17. }
    Alles anzeigen
  • gibt ja verschiedene möglichkeiten
    a) kannst du einfach in komplexeren bedingungen, bei denen du den wert zwischenspeichern musst, den negativen zahlenbereich nutzen, um ihn dann später wieder durch zeichen zu ersetzen

    b) musst du es natürlich nicht speichern, sondern kannst es direkt ausgeben

    Quellcode

    1. if (lotto[L])==(...)) {
    2. cout << " X ";
    3. } else
    4. cout << " " << lotto[L] << " ";
    5. }


    btw: in ein char passt 0-127 - genug für Lotto
  • Ich versuche gerade überhaupt ein rand() Programm zum laufen zu bekommen. Aber folgender Quelltext

    Quellcode

    1. #include <iostream>
    2. #include <cstdlib>
    3. using namespace std;
    4. int main()
    5. {
    6. int feld[64][64];
    7. for (int i=0; i<8; i++)
    8. {
    9. for (int j=0; j<8; j++)
    10. {
    11. feld[i][j]= rand();
    12. cout << "[" << i << "," << j << "] = " << feld[i][j] << endl;
    13. }
    14. }
    15. cout << "RAND_MAX = " << RAND_MAX;
    16. return 0;
    17. }
    Alles anzeigen


    gibt mir immer den folgenden Fehler:

    fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?


    Jedoch wozu sollte ich die stdafx.h einbinden? Weiss jemand Rat?

    UPDATE: Nach Löschen des Projektes und nochmaligem schreiben hat es dann doch ohne Probleme funktioniert. Irgendwie nervt VC doch gewaltig mit seinen Eigenheiten.