Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zufallszahlen ohne Wiederholung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.05.2011, 17:08 Uhr
Cranos



Ich bin noch sehr unerfahren was Programmierung angeht und soll für die Uni Mastermind in C++ programmiern, dabei soll der Code aus Zufallszahlen ohne Wiederholungen bestehen, die generierung habe ich wie folgt gelöst :


C++:
void zahl ()
{
     int code[5];
     for (int i=0;i<5;i++)
     {
         code[i]= (rand() % 8) +1;  
         cout << code[i] << setw(3) ;
     }
     return;
}


nur die Zahlen wiederholen sich, wie kann ich das Einschränken , das sich die Zahlen nicht wiederholen ?


Edit: cpp-Tags eingefügt.

Dieser Post wurde am 21.05.2011 um 19:54 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.05.2011, 19:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja - du könntest dir merken, welche zahlen schon kamen und die dann halt einfach nicht verwenden
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.05.2011, 20:15 Uhr
0xdeadbeef
Gott
(Operator)



C++:
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>

int main() {
  int code[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

  std::srand(std::time(0));
  std::random_shuffle(code, code + 8);

  for(std::size_t i = 0; i < 5; ++i) {
    std::cout << code[i] << ' ';
  }

  std::cout << std::endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.05.2011, 21:10 Uhr
~f.-th.
Gast


Ich wollte ja schon folgendes schreiben:

Code:
Kommt drauf an welche Sprache es sein soll C oder C++ oder noch etwas anderes?

Eine von mehreren Varianten in C++:
www.cplusplus.com/reference/algorithm/random_shuffle/

Oder soll nur dein Quelltext erweitert werden?
Dazu sehen wir zu wenig. Initialisierst du deinen Generator?
Wenn ich mir das noch mal ansehe was du schreibst, denke ich du vermisst nur das initialisieren, oder? Schreib den Codeabschnitt mal, wenn du den ergänzt hast.



Denke aber er hat kein srand() im Quelltext.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.05.2011, 21:50 Uhr
Cranos



Den srand() habe ich im Quelltext, das war nur ein Ausschnitt auf meinem Mastermind Programm, hier der gesamte Code :

C++:
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;

int main()
{
    int anz,i,a,b,c,v;
    srand(time(NULL));
    
    cout <<"Wieviele Stellen soll der Code haben (2-5 Stellen) ? : ";
    cin >> anz;
    cout << endl;
    while ( anz < 2 || anz > 5 )
    {
          cout << "Unzul\x84 \bssige Anzahl, Stellenanzahl neu eingeben (2-5): ";
          cin >> anz;
    }
    int code[anz];
    for (int i=0;i<anz;i++) code[i]= (rand() % 8) +1;  
    cout << "Der Code wird generiert...\n\n\n";
    
    int zahl[anz][10],kzahl[2][10];
    for (v=0;v<10;v++)
    {
        cout << "Versuch Nr." << v+1 << "\n\n";
        
        for (b=0;b<anz;b++)
        {    
          
               cout << "Zahl ("<< b+1 << "): ";
               cin >> zahl[b][v];
               while ( zahl[b][v] < 1 || zahl[b][v] > 8 )
               {
                   cout << "Wertebereich verlassen, neu eingeben\n";
                   cout << "Zahl ("<< b+1 << "): ";
                   cin >> zahl[b][v];
               }
        }
        cout << endl;


        int pos =0;
        int rz =0;
        for (i=0;i<anz;i++)
        {
            for (b=0;b<anz;b++)
            {
                if ( zahl[b][v]==code[i] && b==i) pos++;
                if ( zahl[b][v]==code[i] && b!=i)  rz++;
            }
        }
        kzahl[0][v] = pos;
        kzahl[1][v] = rz;
        if ( pos == anz )
        {
             cout <<"\n\nSie haben den Code ( ";
             for (i=0;i<anz;i++) cout << code[i] << setw(2);
             cout << " ) beim  " << v+1 << " .ten Versuch geknackt !\n\n";
             system("PAUSE");
             exit (0);
        }                  
        cout << endl << endl;    
        system("Cls");
        for (int d=0;d<=v;d++)
        {
            cout  << "|";
            for (b = 0; b < anz; b++)
            {
                 cout  << setw(2) << zahl[b][d] << setw(2) << "|";
            }
        cout << setw(6) <<  kzahl[0][d] << setw(6) <<  kzahl[1][d];
        cout << endl << endl;
        }
      
    }
    if (v==10)
    {
               cout << "Sie hatten ihre 10 Versuche, der Code w\x84 \bre ";
               for (i=0;i<anz;i++) cout << code[i] << setw(2);
               cout << " gewesen. \n";
               system("PAUSE");
               exit (0);
    }

    cout << "\n\n";
    return EXIT_SUCCESS;
}



und der generierte code soll aus zahlen zwischen 1 und 8 bestehen , welche sich nicht wiederholen dürfen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.05.2011, 23:53 Uhr
Cranos



Also ich habe das jetzt mit ner "einfachen" while gelöst, dass die Zahl im "zufallscode" ungleich der vorherigen ist, mit fehlt allerdings noch die überprüfung für die vorherigen Zahlen, mir wurde der Tipp gegeben dass dies auch mit einer for-Schleife geht. Nur ich komme einfach nicht drauf, wäre super wenn ihr mir dabei weiterhelfen könnt


C++:
    srand(time(NULL));    
    for (int i=0;i<anz;i++)
              {
                  code[i]= (rand() % 8) +1;
                  while ( code[i] == code[i-1] )
                  {
                        code[i]= (rand() % 8) +1;  
                  }
              }


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.05.2011, 01:05 Uhr
Hans
Library Walker
(Operator)


Hi,

ich weis gerade nicht, ob es mal wieder an meinen Compilern liegt, was bei C++ schon mal passieren kann, aber bei diesen zwei Zeilen:

C++:
    int code[anz];

    int zahl[anz][10],kzahl[2][10];


werfen sie beide die Fehlermeldung, das da ein konstanter Ausdruck in den eckigen Klammern stehen muss.

Was Dein Problem mit der Auswahl angeht, so ist die Lösung mit random_shuffle wahrscheinlich die effektivste, aber anscheinend in der Aufgabe nicht gefragt. Eine weitere Möglichkeit wäre ein weiteres Array, aus dem Datentyp Bool, wo Anfangs alles auf FALSE steht, und für jede gezogene Zahl das Arrayelement auf TRUE gesetzt wird. Das erleichtert die Suche, da man nicht mehr alle Zahlen miteinander vergleichen muss.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.05.2011, 14:03 Uhr
Cranos



Muss man das über nen Bool machen ? Ist es nicht auch mit "einfachen" Schleifen möglich ? Mit Bool kenn ich mich nämlich noch garnicht aus. Mein Ansatz wäre jetzt :

C++:
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <algorithm>
using namespace std;


    
  
int main(int argc, char *argv[])
{  
    int anz,i;

    cout << "Gebe Anzahl an: ";
    cin >> anz;
    cout << endl;
    int code[anz];
    srand(time(NULL));  
    for (int i=0;i<anz;i++)
              {
                  code[i]= (rand() % 8) +1;
                  for ( int a=1 ; a< i ; a++ )        
                  {
                      while ( code[i] == code[i-a] )
                      {
                            code[i]= (rand() % 8) +1;  
                      }
                  }
              }
    

        for (int i=0;i<anz;i++)
        {          
        cout << code[i] << setw(3);
        }
        cout << endl << endl;


    cout << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}



Könnte ich mit so einer "Taktik" zum Ergebnis kommen oder muss ich das über nen Bool machen ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.05.2011, 15:04 Uhr
~f.-th.
Gast


bool kennt doch nur zwei Zustände - ist doch nur eine "Spezialvariante" von int,

www.imb-jena.de/~gmueller/kurse/c_c++/c625.html

Je nach Implementierung auch mal als Bool im Quelltext.
c++ sollte bool meist kennen.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.05.2011, 00:42 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von Cranos:
Muss man das über nen Bool machen ?


nein, das musst Du nicht. Aber wenn Du mal ein Array mit mehr als 8 Elementen nach doppelten Inhalten durchsuchen musst, dann kann es passieren, das Dein Programm seeeehr lange läuft. In dem Fall ist die Variante mit dem Bool-Array eine Möglichkeit, die zum suchen benötigte Zeit zu verkürzen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: