C++ Zufallsgenerator in C++

iJerkface

Lieutenant
Registriert
März 2012
Beiträge
665
Moin .
Ich brauche einen Zufallsgenerator , er soll im Endeffekt so eine Kombi ausgeben :
XX-XX-XX-XXX (An Stelle der X's soll dann eine Zahl von 1-9 stehen)

Ich könnte ja im Prinzip viele Zahlen erzeugen und als Chararray ausgeben , oder?

Die Frage :

Wie könnte ich diese Zahlen per Zufall erzeugen?

PS : Welchen C++ Compiler empfiehlt ihr? Benutze grad die 5er Beta des Bloodshed.

MfG iJerkface.
 
Bezüglich der Zufallszahlen: std::rand

Als Compiler sind (unter unixoiden Betriebssystemen) grundsätzlich gcc und clang zu empfehlen (beide open source). Für Anfänger empfehle ich clang aufgrund seiner deutlich verständlicheren Fehlermeldungen.
 
Danke.
Ergänzung ()

Verstehe es trotzdem nicht.
Gibts was Idiotensicheres?
 
Könntest du näher erläutern, was du nicht verstehst?
Du wolltest eine Funktion, die dir Zufallszahlen erzeugt, std::rand tut genau dies. Deine Aufgabe ist jetzt halt noch, mithilfe eventuell mehrerer Aufrufe dieser Funktion und den zurückgegebenen ints dein Zahlenmuster zu erzeugen.
 
Code:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
       for (unsigned u = 0; u < 9; u++)
   {
      cout << 1 + rand() % 9 ;
   }
   cout << endl;
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

Soh , ich will aber jedesmal ne andere Kombi ausgegeben haben. Es kommt aber immer die selbe.
 
cppreference hätte dir die Antwort auch gegeben ;)
"srand() should be called before any calls to rand() to initialize the random number generator."
 
Schreib ich dann einfach srand() ? :D
Ergänzung ()

Code:
#include <cstdlib>
#include <iostream>

using namespace std;
  void schinkenspicker () 
  {
            for (unsigned u = 0; u < 2; u++) // WTF
   {
      cout << 1 + rand() % 9 ; // WTF
   }
}
  void schinkenspicker2 () 
  {
            for (unsigned u = 0; u < 2; u++) // WTF
   {
      cout << 1 + rand() % 9 ; // WTF
   }
}
  void schinkenspicker3 () 
  {
            for (unsigned u = 0; u < 2; u++) // WTF
   {
      cout << 1 + rand() % 9 ; // WTF
   }
}
  void schinkenspicker5 () 
  {
            for (unsigned u = 0; u < 3; u++) // WTF
   {
      cout << 1 + rand() % 9 ; // WTF
   }
}






int main(int argc, char *argv[])
{
 schinkenspicker () ;
cout << " - " ;
 schinkenspicker2 ();
cout << " - " ;
 schinkenspicker3 ();
cout << " - " ;
 schinkenspicker5 ();
 cout << " " << endl;






   cout << endl; // not WTF
   
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
srand initialisiert den Zufallsgenerator. D.h. du rufst srand *einmal* zu Beginn deines Programmes auf.
Ich bin so frei und kopier' die betreffende Stelle nochmal hier rein:
Code:
#include <cstdlib>
#include <ctime>
int main()
{
    std::srand(time(0)); //use current time as seed for random generator

    // Jetzt erst std::rand() benutzen!
    // ...
}
 
Ich bedanke mich , ich hab das Programm zum laufen gebracht :)
 
Die Variante x + rand() % y erzeugt ungleich verteilte Zufallszahlen.

Ein Beispiel: RAND_MAX sei 100 und x = 0, sowie y = 7.
Wenn rand() jeden Wert von 0 bis 99 mit der selben Wahrscheinlichkeit ausspuckt, ergibt sich
für die Ergebnisse 0 und 1 eine Wahrscheinlichkeit von 15/100 und für 2, 3, 4, 5 und 6 jeweils 14/100
Das kommt Daher, dass für die Ergebnisse von rand() im Bereich {0 ... 97} rand() % 7 14 mal die
Werte 0 bis 6 durchläuft, danach aber nur noch 98 und 99 folgen, die 0 und 1 ausgeben, so dass diese
beiden Werte einmal häufiger auftreten.

Für dieses Problem habe ich eine Lösung geschrieben, die es unter Anderem hier gibt (allerdings in C):
https://github.com/SirDzstic/boskop-ng/blob/master/src/rrand.c
 
Das ist aber nicht trivial und für kryptographische Aufgaben auch nicht zu gebrauchen. Da sollte man eher
/dev/random benutzen und damit leben, unter Umständen lange auf seine Zufallszahlen zu warten.
Außerdem ist es natürlich nicht portabel. Ich beschwere mich darüber zwar hauptsächlich, wenn es um
Windowszeug wie DirectX geht, aber in der anderen Richtung sollte man meiner Meinung nach auch auf
Portabilität Wert legen.
 
Ich glaub, portabel gut Zufallszahlen zu bekommen ist kompliziert, da einfach die "undefinierten" Zustände standardmäßig schwer zu bekommen sind, und v.a. müsste man damit dann ein MersenneTwister o.Ä. initialisieren.

Ich glaub halt, dass dem TE es vollkommen reicht, die rand()s irgendwie zu bekommen für seine Serials muss die Generierung ja auch nicht wasserdicht sein.
 
Boost oder Crypto++ nutzen um plattformunabhängig sichere Zufallszahlen zu erzeugen und glücklich werden. Die Standardbibliothek ist leider Gottes C++' größte Schwachstelle.
 
Ich habe einen Gameserver gestartet und möchte für die Registrierung verschiedener Gutscheincodes einen Zufallsgenerator haben , was extrem kryptographisches Brauch ich auch wieder nicht.
Die rand() funktion hat bestens gepasst.
Einziges Problem besteht nurnoch darin , dass ganze von der Console auf ein grafisch schön designetes PRogramm mit Buttons usw zu bringen
 
Wenn die Zufallszahlen vorhersehbar sind (wie die, die rand() ausgibt), kann man deine Gutscheincodes
ohne viel Aufwand selbst erzeugen, ohne je einen Gutschein erhalten zu haben. Du willst für sowas einen
guten Zufallsgenerator haben. Sieh dir unter Windows die Cryptographic API an oder unter Linux, wie man
Daten aus /dev/random holt.
 
Zurück
Oben