[c++] Password Generator

Overloader

Cadet 4th Year
Registriert
Jan. 2004
Beiträge
91
Schaut euch mal bitte folgendes Codebeispiel an:

Code:
int p = 0;  	
CString strPass = "";  	
for (int x = 0; x<=5; x++)  	
{
        p = RandomNumber(); 
        strPass = strPass + PassLetters[p];  	
}  	
return strPass;

Hier eine kurze Erklärung. Die Schleife erzeugt ein 6 stelliges Password. Die Funktion RandomNumber() erzeugt eine Zufallszahl. Diese Zufallszahl p wird benutzt um aus dem Array PassLetters, was Buchstaben und Zahlen enthält, den Wert anhand des Indexes herauszulesen. Dann wird strPass immer der neue Buchstabe oder Zahl angehängt.

Mein Problem ist jetzt, das ich 6 mal die gleiche Zahl bzw. Buchstaben erhalte und wenn ich es im Einzelschritt durchlaufen lasse, funktioniert es wunderbar. Woran soll das liegen, ist mein Rechner zu schnell oder was? :D

Danke für eure Hilfe!
 
hallo, das hängt damit zusammen, dass der Computer als logisch arbeitente Maschine (schlecht ausgedrückt, hoffe ihr wisst was ich meine ;-)) gar keine echten Zufallszahlen erstellen kann. Daher errechnet er Zufallszahlen immer aus Daten wie Systemzeit oder Systemkomponenten...
Bei Delphi müsstest du in dir or-Schleife noch ein Randomize; setzen, wie das bei C++ aussieht wweiß ich leider nicht, müsste baer so ähnlich sein. Werd mal schnell googeln, gucken ob ich was finde ;-)
 
jap, du musst definitiv die zufallsfunktion initialisieren. nur fällt mir das codefragment auch gerade nicht ein. probiers mal mit randomize(); oder frag mal herrn google =)
 
oder srand() :)
 
MystiC schrieb:
Bei Delphi müsstest du in dir or-Schleife noch ein Randomize; setzen, wie das bei C++ aussieht wweiß ich leider nicht, müsste baer so ähnlich sein.


^^Also ich würd das vor der Schleife machen, weil der Generator ja nur einmal gestartet werden muss und dann läuft.

Und... wär es dir zufällig genug, wenn du statt dem generator für die zufallszahl die Zeit für ne Inetverbindung misst.. zB den download einer datei oder so...

Das kann man noch weniger bestimmen.
 
Die Initialisierung des Zufallsgenerators muss auf jeden Fall aus der Schleife raus, da man sonst bei den meisten Standard-Generatoren immerwieder die selbe Zahl zurückbekommt. Ich würde mal genau vermuten, dass deine Funktion RandomNumber() bei jedem Aufruf den Zufallsgenerator neu initialisiert.

Initialisieren braucht man den Genrator übrigens nicht. Er ist dann auf einem halbwegs zufälligen Startwert. Man muss nur srand() etc. benutzen, wenn man die Zufallszahlen reproduzierbar braucht.
EDIT: An den Kopf fass... natürlich braucht man die Zahlen reproduzierbar :) Also ein srand (0); oder sonstwas vor der Schleife machen
 
Zuletzt bearbeitet:
Ja, RandomNumber() erzeugt immer eine neue Zufallszahl. Die Funktion RandomNUmber() muss jedes mal neu aufgerufen werden, damit eine neue Zufallszahl ensteht die dann einen Buchstaben oder eine Zahl aus dem PassLetters[] Array ausliest. Im Einzelschritt funktioniert das auch, bloß nicht wenn ich das Programm normal laufen lasse. Woran soll das liegen? Der Fehler muss in der Schleife liegen bzw. irgendwie an der Zuweisung zu strPass.
 
Also das sind zwei verschiedene Sachen:

1. : Den Zufallsgenerator initialisieren
2. : Zufallszahlen erzeugen

Die Funktion RandomNumber () scheint beides zu machen, obwohl sie nur das zweite machen sollte.

Das Problem ist nämlich folgendes: Der Zufallsgenerator wird anscheinend mit der Systemzeit initialisiert. Und da während des Ablaufs des Programms ohne Debugger die Systemtzeit quasi nicht ändert, wird der Zufallsgenerator immer wieder mit dem selben Wert initialisiert und erzeugt so auch immer wieder die selbe Zufallszahl. Im Debugger dagegen verstreicht ausreichend Zeit, sodass verschiedene Zahlen erzeugt werden.

Poste mal die Funktion RandomNumber()
 
RandNumber() Funktion

Code:
EasyRandom RandomX(0,62); // Random erzeugen von Klasse EasyRandom Intervall von bis 
 	
RandomX.SetTimerSeed(); // Zufallszahl erzeugen  

for (int i = 0; i < 30; i++)   	
{  		
      GenNr = RandomX.DrawRandomNumber(); // Zufallszahl zurückgeben  	
}    

return GenNr;

Jetzt die wichtigste Klasse SetTimerSeed()

Code:
time_t SeedTime;  	
struct tm SeedDate;  	
SeedTime = time(0);  	
SeedDate = *localtime(&SeedTime);  	
int FinalSeed = SeedTime + SeedDate.tm_mday + (SeedDate.tm_mon+1) + (SeedDate.tm_year+1900);  	
srand((unsigned int) FinalSeed);

und DrawRandomNumber() sieht so aus

Code:
int Interval = GetHigh() - GetLow() + 1;  	
int RandomOffset = rand() % Interval;  
int RandomNumber = GetLow() + RandomOffset;  	
return RandomNumber;

Damit sollte es erstmal fürs erste reichen. :) Ich hoffe ihr seht da noch durch. DIe KLasse EasyRandom ist übrigens von The Code Project
 
Naja, es ist offensichtlich.
In jedem Aufruf von RandomNumber () wird EasyRandom::SetTimerSeed aufgerufen. Da SetTimerSeed time () verwendet, und während der Schleifenausführung nicht genug Zeit vergeht das time sich ändert, ist die Saat für die Zufallszahlen immer wieder die selbe. Und damit bekommst Du auch immer die selbe Zufallszahl. Also, das Konzept musst Du irgendwie ändern, dass das SetTimerSeed aus der Funktion rauskommt.
 
OK, wenn du mir das jetzt so sagst, wird mir das klar. :) Ich danke dir für deine Hilfe, damit sollte es dann funktionieren.
 

Ähnliche Themen

Zurück
Oben