ubuntuusers.de

[C] Immer selbe Zufallszahl?

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

Budada_Bubladend

Avatar von Budada_Bubladend

Anmeldungsdatum:
13. Dezember 2009

Beiträge: 812

Hallo Leute,

ich habe gerad das Problem, dass ich den Wald vor lauter Bäumen nicht sehe! Ein C-Programm von mir will nicht so wie ich. Das Programm ist eig. nur eine Übung für C (ein Passwortgenerator).

Hat vielleicht jemand eine Minute und kann einen Fehler finden?

Danke schon mal im voraus

Lg BB

code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int zufall (int modulo , int zeichenart){
	int random , buchst , ziffer;
	srand ( time (0) + getpid() );
	random=rand()%modulo;
	//printf ( "zufall: %d" , random );
	
	switch (zeichenart){
		case 0 :
			buchst=random+'A';
			return buchst;
			break;

		case 1 :
			buchst=random+'a';
			return buchst;
			break;

		case 2 :
			ziffer=random;
			return ziffer;
			break;
	}


}


int main (){

	int anzahl=0 , gruppe , zeichen , index=0 , asci_anzahl;
	//int ziffer;
	printf ( "Anzhal der Zeichen: " );
	scanf ( "%d" , &anzahl );
	asci_anzahl=anzahl+1;
	char passwort [asci_anzahl];
	while ( index <= anzahl ){

     	    gruppe=zufall ( 3 , 2 );
	
	switch (gruppe){
		case 0 :
			zeichen=zufall ( 26 , 0 );
			break;
		case 1 :
			zeichen=zufall ( 26 , 1 );
			break;
		case 2 :
			zeichen=zufall ( 10 , 2 );
			break;
	}
	   passwort [index]=zeichen;
	   index++;
	}
	passwort [index]='\0';
	printf ( "%s\n" , passwort );



}

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17624

Wohnort: Berlin

Ich finde massig Umständlichkeiten.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int zufall (const int modulo, const int zeichenart) {

	int random = rand () % modulo;
	switch (zeichenart) {
		case 0:	return random + 'A';
		case 1:	return random + 'a';
		case 2:	return random;
	}
}

int main () {

	srand (time (0) + getpid ());

	int anzahl=0;
	printf ("Anzhal der Zeichen: ");
	scanf ("%d" , &anzahl);
	char passwort [anzahl + 1];
	passwort [anzahl] = '\0';
	for (int index = 0; index <= anzahl; ++index) {
 		const int gruppe = zufall (3, 2);
		passwort [index] = zufall (26, gruppe);
	}
	printf ("%s\n" , passwort);
}
  • Ein break hinter einem return ist unreachable code.

  • Das zweite switch ruft immer zufall (26, gruppe) auf - das kann man auch ohne switch haben.

  • Dann verschwindet die Notwendigkeit vieler temporärer Variablen.

  • Eine ascii_anzahl-Variable, die nur einmal genutzt wird, ist überflüssig.

  • Bei mir liefert das Programm, mehrfach aufgerufen, unterschiedliche Ergebnisse.

  • Man kann das rand beim deklarieren gleich initialisieren. Das ist schon deshalb eine gute Idee, weil es die Semantik der Variablen zu dokumentieren hilft.

  • Wenn man das Stringende zu Beginn verarztet braucht man keinen index ausserhalb der Schleife, und kann dann auch die näherliegende for-loop beschäftigen.

Zum kompilieren:

1
gcc -std=c99 zufallsPw.c -o zufallsPw

Hauptsache ist aber, dass Du rand immer neu initialisierst. Dabei ist aber die PID immer gleich, und weil es so schnell geht, die von time(0) verwendete Zeit wohl auch fast immer. Dann wird der Generator gleich initialisiert, und liefert das gleiche Ergebnis. Initialisiere den RNG nur einmal im Programm.

Budada_Bubladend

(Themenstarter)
Avatar von Budada_Bubladend

Anmeldungsdatum:
13. Dezember 2009

Beiträge: 812

Hey user unknown,

danke für deine schnelle Hilfe! Es mag sein, dass der Code ein wenig umständlich erscheinen mag, aber ich bin noch ein Einsteiger ☺ Danke also für deine Erklärungen zum Vereinfachen des Codes. Ich verfole mal deinen geänderten Code.

Danke

Gruß BB^

Antworten |