Lottozahlengenerator



  • Danke Dobi!

    Aber bei dem programm kommt bei mir eine Fehlermeldung.

    In function `int main()':
    ISO C++ forbids declaration of 'it' with no type
    cannot convert 'std::_Rb_tree_const_iterator<int>' to 'int' in initialization



  • Gut, dann halt so:

    #include <ctime>
    #include <set>
    #include <iostream>
    int main() {
        using namespace std;
        srand(static_cast<unsigned int>(time(0)));
        typedef set<int> TZahlen;
        cout << "Wie viele Runden?\n";
        int runden;
        cin >> runden;
        runden = std::min(runden, 12);
        for(int i = 0; i < runden; ++i) {
            TZahlen zahlen;
            do {
                zahlen.insert(rand() % 48 +1);
            } while(zahlen.size() != 6);
            for(TZahlen::iterator it = zahlen.begin(); it != zahlen.end(); ++it)
                cout << *it << ' ';
            cout << "\n";
        }
    }
    


  • Vielen vielen Dank!

    Sieht gut aus, ich verstehe es sogar fast komplett. Bis auf das mit dem typedef set<int> TZahlen;

    aber Danke vielmals!!



  • Das set ( http://www.cplusplus.com/reference/stl/set/ ) ist das, was die eigentliche Arbeit macht. Es sorgt dafür, dass keine Zahl doppelt vorkommt und dass sie geordnet werden.
    Deine Aufgabe ist es ja jetzt, diese Dinge mit den von dir gewünschten Arrays zu implementieren.



  • Finde die Lösungen der Art "versuche so lange bis..." nicht so schön. Alternative:

    #include <ctime>
    #include <vector>
    #include <iostream>
    #include <iomanip>
    #include <iterator>
    #include <algorithm>
    
    struct Generator
    {
    	unsigned int Next;
    
    	Generator() : Next( 0 )
    	{
    	}
    
    	unsigned int operator()()
    	{
    		return ++Next;
    	}
    };
    
    int main()
    {
    	std::srand( std::time( 0 ) );
    	std::vector<unsigned int> Numbers;
    
    	std::generate_n( std::back_inserter( Numbers ), 49, Generator() );
    
    	for( unsigned int i = 0; i < 12; ++i )
    	{
    		std::random_shuffle( Numbers.begin(), Numbers.end() );
    		std::sort( Numbers.begin(), Numbers.begin() +6 );
    		std::copy( Numbers.begin(), Numbers.begin() +6, std::ostream_iterator<unsigned int>( std::cout, " " ) );
    		std::cout << "\n";
    	}
    }
    


  • DocShoe schrieb:

    ...

    👍


  • Mod

    DocShoe schrieb:

    Finde die Lösungen der Art "versuche so lange bis..." nicht so schön. Alternative:

    Ich mag aber auch nicht die Einstellung, unnötig viele Zufallszahlen zu ziehen, wenn wir nur 6 möchten:

    #include <vector>
    #include <iterator>
    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    template <class RandomAccessIterator, class Size, class RandomNumberGenerator>
    void random_shuffle_n (RandomAccessIterator first, 
                           RandomAccessIterator last, 
                           Size N,
                           RandomNumberGenerator& rng)
    {
      iterator_traits<RandomAccessIterator>::difference_type distance = last - first, i;
      for (; i < N; ++i)
        swap(first[i], first[rng() % distance]);
    }
    
    template <class RandomAccessIterator, class Size>
    void random_shuffle_n (RandomAccessIterator first, 
                           RandomAccessIterator last, 
                           Size N)
    {
      random_shuffle_n(first, last, N, std::rand);
    }
    
    int counter () { static int current = 0; return ++current; }
    
    int main()
    {
      vector<int> zahlen;
      generate_n(back_inserter(zahlen), 49, counter);
      for (int i = 0; i < 12; ++i ) 
        {
          random_shuffle_n(zahlen.begin(), zahlen.end(), 6);
          ostream_iterator<int> out_it (cout," ");
          sort(zahlen.begin(), zahlen.begin()+6);
          copy(zahlen.begin(), zahlen.begin()+6, out_it);
          cout << '\n';
       }
    }
    


  • Hatte ich mir auch überlegt, aber weil es im Standard keinen random_shuffle_n gibt und ich zu faul war, das auch noch zu machen, hab´ ich´s sein gelassen.

    PS:
    Wenn du den RandomNumberGenerator nicht als Referenz sondern per Value übergibst kann man auch temporäre Generatorobjekte benutzen.



  • Hehe, hübsch. 🙂
    Irgendwie déjà-vue ich gerade. Hatten wir sowas nicht schonmal und damals sogar rumgerechnet und profiled bis welches n es schneller ist, einfach solange Zahlen zu ziehen bis man n verschiedene hat?


  • Mod

    Dobi schrieb:

    Hehe, hübsch. 🙂
    Irgendwie déjà-vue ich gerade. Hatten wir sowas nicht schonmal und damals sogar rumgerechnet und profiled bis welches n es schneller ist, einfach solange Zahlen zu ziehen bis man n verschiedene hat?

    Ja, das haben wir alle paar Monate mal. Bei 6 aus 49 haben (leider) immer die naiven Wegwerfalgorithmen gewonnen, also wie z.B. deiner (wobei vector dort deutlich schneller wäre als set, weil die Zahl 6 so klein ist). Was natürlich für Anfänger nicht so doll ist, weil sie dann keine Motivation haben, bessere Algorithmen zu benutzen. Aber für Fortgeschrittene wieder gut, weil sie sehen, dass primitiv nicht unbedingt schlecht ist.



  • Hallo zusammen

    wie viele vor mir erlerne ich auch grade C für meinen Fachinfo.

    Wir haben die Aufgabe bekommen ebenfalls einen Lottospiel zu programieren

    -6 random zahlen sollen mit 6 eingegeben zahlen vergliechen werden.

    Ich habe schon etwas angefangen aber ich bekomme viele error's und hab noch nicht alles fertig.

    Ich würde mich freuen wenn mir jemand vllt ein paar denk anstöße geben kann.
    Mir fehlt leider "noch" die nötige C Sprache.
    Vielen Dank schon mal

    // Lotto Zahlen.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //

    #include "stdafx.h"
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #define mx 49

    void main()
    {
    int Ja[1];

    char zahl1[10]; //noch 49++1 realisieren evtl als int?
    char zahl2[10];
    char zahl3[10];
    char zahl4[10];
    char zahl5[10];
    char zahl6[10];
    char szahl[10];
    char name[50];
    char ok[2];
    srand(time(NULL));

    int num1=rand()%49+1;
    int num2=rand()%49+1;
    int num3=rand()%49+1;
    int num4=rand()%49+1;
    int num5=rand()%49+1;
    int num6=rand()%49+1;
    int snum=rand()%49+1;
    bool max=false;

    printf("Willkomen zur Lottery 6 aus 49 mit Superzahl\n");
    printf("\nBitte geben Sie ihren Namen ein\n");
    scanf("%s",name);
    printf("Hallo %s, wählen Sie nun ihre 6 Zahlen plus Superzahl aus\n");
    while (max=true)
    {
    printf("Geben Sie ihre erste Zahl ein\n");
    scanf("%s",zahl1);
    if(zahl1>mx)
    else (max=true)

    printf("Geben Sie ihre zweite Zahl ein\n");
    scanf("%s",zahl2);
    if(zahl2>mx){
    if(zahl2=zahl1)}
    else(max=true)

    printf("Geben Sie ihre dritte Zahl ein\n");
    scanf("%s",zahl3);
    if(zahl3>mx){
    if(zahl3=zahl1){
    if(zahl3=zahl2)}}
    else(max=true)

    printf("Geben Sie ihre vierte Zahl ein\n");
    scanf("%s",zahl4);
    if(zahl4>mx){
    if(zahl4=zahl1){
    if(zahl4=zahl2){
    if(zahl4=zahl3)}}}
    else(max=true)

    printf("Geben Sie ihre fuenfte Zahl ein\n");
    scanf("%s",zahl5);
    if(zahl5>mx){
    if(zahl5=zahl1){
    if(zahl5=zahl2){
    if(zahl5=zahl3){
    if(zahl5=zahl4)}}}}
    else(max=true)

    printf("Geben Sie ihre Superzahl ein\n");
    scanf("%s",szahl);
    if(szahl>mx){
    if(szahl=zahl1){
    if(szahl=zahl2){
    if(szahl=zahl3){
    if(szahl=zahl4){
    if(szahl=zahl5)}}}}}
    else(max=true)

    //printf("\nIhre eingegebenen Zahlen wurden vom System bestaetigt, sind Sie sich sicher,dass Sie mit den eingegebenen Zahlen an der Lottery teilnehmen wollen?\n");
    //printf("Wenn JA geben Sie (1) ein\n");
    //scanf("%s",Ja);
    //if(Ja==1)
    {
    printf("\nDie gezogenen Zahlen sind\n");
    printf("\n %i %i %i \n %i %i %i\n",num1,num2,num3,num4,num5,num6);
    //Zahlen vergleichen Die rand mit scanf Zahlen
    printf("Und die Superzahl ist\n %i\n",snum);
    }
    //else
    //printf("\nSelber Schuld\n");
    }



  • 1. Sodomie
    2. C != C++ => falsches Forum



  • 1. Das ist Nekrophilie

    2. Falsches Unterforum, Keine Codetags

    3. Wenn du viele Variablen hast, deren Bezeichnung sich in ZAhlen unterscheidet, ist das ein Anzeichne dafür, dass du ein Array benötigst.
    Dann kannst du viele SAchen in einer Schleife machen.

    4. Da du Zahlenwerte vergleichst, sind Strings (char-Arrays) sehr sehr unpraktisch.
    Zumal du den Umgang damit wohl noch nicht gelernt hast.


Anmelden zum Antworten