lotto 6 aus 45, doppelte zahlen vermeiden

MasterOfTheDark

Grünschnabel
hallo!

hab mal aus fun versucht Lotto zu programmieren, leider tritt oft das Problem auf, dass eine zahl 2 mal vorkommt und wollte euch jetzt nach Hilfe fragen.

Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[])
{
    int wuerfel,i;
    char janein,Janein;
    do
    {
    printf("willkommen beim Lotto 6 aus 45\n");
    srand(time(NULL));
    wuerfel=rand()%45+1;
    for(i=20;i>0;i--)//verzögerung der ausgabe
         {
             Sleep(50);
             printf("-");
         }
    printf("%d\n",wuerfel);    
    wuerfel=0;
    wuerfel=rand()%45+1;
    for(i=20;i>0;i--)//verzögerung der ausgabe
         {
             Sleep(50);
             printf("-");
         }
    printf("%d\n",wuerfel);    
    wuerfel=0;
    wuerfel=rand()%45+1;
    for(i=20;i>0;i--)//verzögerung der ausgabe
         {
             Sleep(50);
             printf("-");
         }
    printf("%d\n",wuerfel);    
    wuerfel=0;
    wuerfel=rand()%45+1;
    for(i=20;i>0;i--)//verzögerung der ausgabe
         {
             Sleep(50);
             printf("-");
         }
    printf("%d\n",wuerfel);    
    wuerfel=0;
    wuerfel=rand()%45+1;
    for(i=20;i>0;i--)//verzögerung der ausgabe
         {
             Sleep(50);
             printf("-");
         }
    printf("%d\n",wuerfel);    
    wuerfel=0;
    wuerfel=rand()%45+1;
    for(i=20;i>0;i--)//verzögerung der ausgabe
         {
             Sleep(50);
             printf("-");
         }
    printf("%d\n",wuerfel);    
    wuerfel=0;
    printf("willst du weiterspielen?[J/N]\n");     
    fflush(stdin);
    scanf("%c", &janein);
    system("cls");
    }
    while(janein=='J' || janein=='j');
    system("PAUSE");
    return EXIT_SUCCESS;
}

funktioniert das nur mit langwierigen if-Anweisungen, oder geht das auch schneller?

lg MasterOfDarkness
 
Zuletzt bearbeitet:
Hi.

Natürlich geht das viel schneller. Du solltest du entsprechende Funktionalität in eigene Funktionen auslagern.

In C++ wäre es am Einfachsten einen vector mit 45 "Kugeln" zu füllen, dessen Elemente dann in eine zufällige Reihenfolge zu bringen und nur die ersten 6 Elemente auszugeben.

Gruß
 
Die Idee mit dem Vector ist gut, ich dachte an die simplere Methode, ein Array in einer Schleife zu füllen. Natürlich wird eine Zahl nur zum Array hinzugefügt, wenn sie nicht schon drin ist.

Da ich kein C programmiere, hier eine Codeform, die aber noch ins Reine gebracht werden muss, das ist Kauderwelsch, man möge mir vergeben :)

Code:
int Zahlen() // keine Ahnung wie Arrays in C aussehen
for(Zug=1;Zug>6;Zug++) //6 Züge
{
  gibtsschon=0;            
  repeat
    wurf=rand()%45+1;
    for(Prüfung=0;Prüfung>Zug;Prüfung++)
      { 
       if(wurf=Zahlen(Prüfung)) {gibtsschon=1;}
      }
   until(gibtsschon=0)
   Zahlen(Zug)=wurf;
}
for(Zahlenzeigen=0;Zahlenzeigen>6;i++)
{
  printf Zahlen(i)
  // Pause für die Spannung :)
}

mfg chmee
 
Hi.

Mein Vorschlag in C++:
C++:
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>

#include <cstdlib>


using namespace std;

class seq {
  char current;

public:
  seq(char init) : current(init) { }

  char operator() () {
	return current++;
  }
};

int main(int argc, char *argv[])
{
  string pool;

  srand(time(NULL));

  generate_n(back_inserter(pool), 45, seq(1));

  random_shuffle(pool.begin(), pool.end());

  copy(pool.begin(), pool.begin() + 6,
	   ostream_iterator<int>(cout, " "));

  cout << endl;

  return 0;
}
Gruß
 
Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;
int main(int argc, char *argv[])
{
int Zahlen[7]; // für 6 speicherplätze
int Zug;
int i;
int gibtsschon;
int Zahlenzeigen;
int Pruefung;
int wurf;
{   

for(Zug=1;Zug>6;Zug++) //6 Züge
{
  gibtsschon=0;            
  do
  {
    wurf=rand()%45+1;
    for(Pruefung=0;Pruefung>Zug;Pruefung++);
      { 
       if(wurf=Zahlen[Pruefung])
       {
          gibtsschon=1;
       }
      }
   }
   while(gibtsschon=0);
   Zahlen[Zug]=wurf;
}
for(Zahlenzeigen=0;Zahlenzeigen>6;Zahlenzeigen++)
{
  printf("%d",Zahlen[i]);
  for(i=10;i>0;i--)
  {
      Sleep(50);
      printf("-");
  }
}
}
system("PAUSE");
return EXIT_SUCCESS;
}
naja, fehlermeldungen weg, aber im ausgabefenster erscheint nur"drücken sie eine beliebige taste...."?
 
Zuletzt bearbeitet:
Ich glaube, du hast da ein paar Strichpunkte vergessen? Oder ist die geschweifte Klammer an der falschen Stelle?

Code:
int main(int argc, char *argv[])
{
int Zahlen[7]; // für 6 speicherplätze
int Zug;
int gibtsschon;
int Prüfung;
int wurf;
 
Code:
int Zahlen[7] // für 6 speicherplätze
Das Array bietet 7 Speicherplätze, von 0 bis 6.
Code:
  gibtsschon=0;            
  repeat
    wurf=rand()%45+1;
    for(Prüfung=0;Prüfung>Zug;Prüfung++);
      { 
       if(wurf=Zahlen(Prüfung)) {gibtsschon=1;}
      }
   until(gibtsschon=0)
   Zahlen[Zug]=wurf;
}
Wie von chmee bereits gesagt, ist das nur Pseudocode. Du mußt erstmal den Code verstehen und die Sachen die es in C/C++ nicht gibt, durch entsprechende Befehle ersetzen. repeat und until gibt's doch gar nicht, da mußt du eine Schleife bauen.

Mach es dir einfach und nutze Funktionen. Sonst siehst du doch schon jetzt nicht mehr durch. Schreibe dir erstmal

1) eine Funktion die eine Zahl von 1 bis 45 zurückgibt

2) eine Funktion die prüft ob eine gegebene Zahl bereits in einem Array enthalten ist und entweder true oder false zurückgibt.

Wenn du das hast und es getestet ist und funktioniert, dann kannst du anfangen das zusammenzubauen.

Gruß
 
1) funktion zum zurückgeben:
srand(time(NULL));
array[7]=rand()%45+1;

2) aber hier das problem, hab keinen schimmer wie das funktioniern sollte, odcer ich steh einfach auf der leitung..

mfg Master
 
1) funktion zum zurückgeben:
srand(time(NULL));
array[7]=rand()%45+1;
Das ist Unsinn. Das ist weder eine Funktion, noch ist es sinnvoll srand mehrfach im Programm aufzurufen. Weiter gibt es den Index 7 bei array gar nicht und das Ermitteln der Zufallszahl sollte man eigentlich nicht auf diese Weise machen. Das Array hat außerdem in der Funktion überhaupt nichts zu suchen.
2) aber hier das problem, hab keinen schimmer wie das funktioniern sollte, odcer ich steh einfach auf der leitung..
Du bist zu voreilig. Du bist ja noch nicht mal mit der ersten Funktion fertig. Und mit testen meine ich auch testen. D.h. z.B. ein Testprogramm zu schreiben welches automatisch die Richtigkeit der Funktionswerte überprüft.

Wenn du dann mal die Funktion für die Zufallszahlen hast, dann brauchst du eine Datenstruktur um die 6 Werte zu sammeln. Dafür kannst du natürlich ein Array mit einer festen Größe nehmen. Dann mußt du dir aber erstmal merken wieviel Elemente überhaupt in dem Array drin sind. Die Suchfunktion müßte dann so aussehen:
C:
bool istschondrin(int array[], int anzahl_der_eintraege_im_array, int such_mich) {
  // Array nach such_mich durchsuchen, wenn gefunden return true
  for (...)  {
    if (...) return true;
  }
  return false;
}
\edit: Wenn diese Funktion implementiert ist, erstmal testen! D.h. ein paar Arrays nehmen und die Funktion damit aufrufen und überprüfen ob das richtige rauskommt:
C:
int a1[] = { 1, 2, 3, 4, 5 };
cout << boolalpha << "a1: " << istschondrin(a1, sizeof(a1)/sizeof(*a1), 6) << " == false" << endl;
...
Gruß

PS: Bitte halte dich an die Netiquette, Punkt 15 - Groß/Kleinschreibung. Danke.
 
Zuletzt bearbeitet:
Zurück