# Zufallsgenerator für Buchstaben



## Vulymuz (20. Feb 2012)

Hallo allerseits,

seit einigen Tagen habe ich damit begonnen, JAVA zu erlernen. Bisher macht es mir unglaublich viel Spaß und bin fast dabei, meinen eigenen Passwortgenerator zu entwerfen, welcher allerdings noch nicht wirklich fertig ist. Dazu wollte ich von euch als erstes wissen, wie ich einen Zufallsgenerator für Buchstaben (*nicht für Zahlen!*) erstellen kann. 

Der Quellcode dazu hier:


```
class PasswortGenerator {
  int zahl = 0;
  int x = 0;
  
  public void generate() {
    while (x < 5) {
      zahl = (int) (Math.random() * 10);
      System.out.println("Die Zahl ist die " + zahl);
      x = x + 1;
    }
    
    
  }
}
```

Beste Grüße!


----------



## pro2 (20. Feb 2012)

Erstell dir ein Array, mit allen möglichen Buchstaben. Dann suchst du dir eine Zufallszahl von 0-25 und holst dir den entsprechenden Buchstaben aus dem Array!


----------



## nrg (20. Feb 2012)

definiere den asci-bereich, den du in deinem passwort haben willst. erzeuge eine zufallszahl von 0 bis zur differenz der unter- und der obergrenze, addiere die untergrenze und caste in ein char. das ganze wiederholst du dann n mal (je nach Länge)


----------



## Marco13 (20. Feb 2012)

char c0 = 'A' + 0; // Ergibt 'A'
char c1 = 'A' + 1; // Ergibt 'B'
char c2 = 'A' + 2; // Ergibt 'C'
char c3 = 'A' + 3; // Ergibt 'D'

Statt Math.random() sollte man lieber ein Random-Objekt verwenden:

```
private static final Random random = new Random(0);

void foo()
{
    int i = random.nextInt(26;
    char c = 'A'+i;
...
```
Erstens weil das so praktische Methoden wie 'nextInt' hat, und zweitens, weil man damit eine reproduzierbare Folge von Zufallswerten bekommt. (Wenn man die "0" beim Konstruktor wegläßt, ist es wieder "nicht-reproduzierbar")


----------



## Michael... (20. Feb 2012)

Buchstaben (char) sind auch nichts anderes als Zahlen (ein Computer kennt nur 0 und 1) siehe:American Standard Code for Information Interchange ? Wikipedia

```
char buchstabe = 65;
System.out.println(buchstabe);
```


----------



## Scarabol (20. Feb 2012)

Marco13 hat gesagt.:


> char c0 = 'A' + 0; // Ergibt 'A'
> char c1 = 'A' + 1; // Ergibt 'B'
> char c2 = 'A' + 2; // Ergibt 'C'
> char c3 = 'A' + 3; // Ergibt 'D'
> ...



Gute Vorschlag, so würde ich das auch machen!

Gruß
Scarabol


----------



## Vulymuz (20. Feb 2012)

```
public class Passwort {

  int zahl = 0;
  int x = 0;
  char buchstabe = 65;
  int z = 0;
  
  public void generate() {
    while (x < 3) {
    zahl = (int) (Math.random() * 10);
    System.out.println("Die erste  Zahl Deiner Passwort ist die " + zahl);
    x = x + 1;
    
    zahl = (int) (Math.random() * 10);
    System.out.println("Die zweite Zahl Deiner Passwort ist die " + zahl);
    x = x + 1;
    
    zahl = (int) (Math.random() * 10);
    System.out.println("Die dritte Zahl Deiner Passwort ist die " + zahl);
    x = x + 1;
    }
    
    while (z < 3) {
      buchstabe = (char) ((Math.random() * 90);
      System.out.println("Der erste Buchstabe Deiner Passwort lautet " + buchstabe);
      z = z + 3;
    }
  }
}
```

Ich habe das jetzt so gemacht ... Gibt es eine Möglichkeit, Math.random() nicht von 0 anfangen zu lassen, sondern 65 bspw.? Die Logik dahinter ist klar: Er soll zwischen 65 und 90 etwas herauspicken ...


----------



## Wildcard (20. Feb 2012)

> Gibt es eine Möglichkeit, Math.random() nicht von 0 anfangen zu lassen, sondern 65 bspw.? Die Logik dahinter ist klar: Er soll zwischen 65 und 90 etwas herauspicken ...


Das wäre ziemlich unnötig, weil du ja einfach 65 aufaddieren kannst.


----------



## Vulymuz (20. Feb 2012)

... und zwar wie?


----------



## Wildcard (20. Feb 2012)

+65


----------



## Vulymuz (20. Feb 2012)

Das hatte aber vorhin nicht geklappt ... 

Habs jetzt auf jeden Fall so gelöst ...


```
public class Passwort {

  int zahl = 0;
  int x = 0;
  char buchstabe = 0;
  int z = 0;

  public void generate() {
    if (x < 3) {
      zahl = (int) (Math.random() * 10);
      System.out.println("Dein Passwort erhält folgende Zahl: " + zahl);
    }

    x = x + 1;
    
    if (z < 3) {
      buchstabe = (char) ((Math.random() * 90));

      while (buchstabe < 65) {
        buchstabe = (char) ((Math.random() * 90));
      }

      if (buchstabe > 64) {
        System.out.println("Dein Passwort erhält folgenden Buchstaben: " + buchstabe);
      }

      z = z + 1;

      generate();
    }
  }
}
```


----------



## pro2 (21. Feb 2012)

Oh nein, das ist ja schrecklich. Wenn du pech hast, rechnet dein PC ewig bis die Zahl größer gleich 65 ist. Nimm doch einfach eine Zufallszahl aus der Spanne und addiere, wie vorgeschlagen, die 65?!


----------



## bygones (21. Feb 2012)

ausserdem solltest du das Deutsch in deinem Code nochmal ueberpruefen....


----------



## bandy (21. Feb 2012)

Vulymuz hat gesagt.:


> Das hatte aber vorhin nicht geklappt ...
> 
> Habs jetzt auf jeden Fall so gelöst ...
> 
> ...



Wie findest du das hier:


```
public class Passwortgenerator {
int passwortlaenge=10;

	public void generate() {
	   for(int i=1; i<=passwortlaenge; i++) {
	    int  zahl = (int) (Math.random() * 52);
	    if(zahl==1) System.out.print("A");
	    if(zahl==2) System.out.print("B");
	    if(zahl==3) System.out.print("C");
	    if(zahl==4) System.out.print("D");
	    if(zahl==5) System.out.print("E");
	    if(zahl==6) System.out.print("F");
	    if(zahl==7) System.out.print("G");
	    if(zahl==8) System.out.print("H");
	    if(zahl==9) System.out.print("I");
	    if(zahl==10) System.out.print("J");
	    if(zahl==11) System.out.print("K");
	    if(zahl==12) System.out.print("L");
	    if(zahl==13) System.out.print("M");
	    if(zahl==14) System.out.print("N");
	    if(zahl==15) System.out.print("O");
	    if(zahl==16) System.out.print("P");
	    if(zahl==17) System.out.print("Q");
	    if(zahl==18) System.out.print("R");
	    if(zahl==19) System.out.print("S");
	    if(zahl==20) System.out.print("T");
	    if(zahl==21) System.out.print("U");
	    if(zahl==22) System.out.print("V");
	    if(zahl==23) System.out.print("W");
	    if(zahl==24) System.out.print("X");
	    if(zahl==25) System.out.print("Y");
	    if(zahl==26) System.out.print("Z");
	    if(zahl==27) System.out.print("a");
	    if(zahl==28) System.out.print("b");
	    if(zahl==29) System.out.print("c");
	    if(zahl==30) System.out.print("d");
	    if(zahl==31) System.out.print("e");
	    if(zahl==32) System.out.print("f");
	    if(zahl==33) System.out.print("g");
	    if(zahl==34) System.out.print("h");
	    if(zahl==35) System.out.print("i");
	    if(zahl==36) System.out.print("j");
	    if(zahl==37) System.out.print("k");
	    if(zahl==38) System.out.print("l");
	    if(zahl==39) System.out.print("m");
	    if(zahl==40) System.out.print("n");
	    if(zahl==41) System.out.print("o");
	    if(zahl==42) System.out.print("p");
	    if(zahl==43) System.out.print("q");
	    if(zahl==44) System.out.print("r");
	    if(zahl==45) System.out.print("s");
	    if(zahl==46) System.out.print("t");
	    if(zahl==47) System.out.print("u");
	    if(zahl==48) System.out.print("v");
	    if(zahl==49) System.out.print("w");
	    if(zahl==50) System.out.print("x");
	    if(zahl==51) System.out.print("y");
	    if(zahl==52) System.out.print("z");    
	    }       
	  }
	
	public static void main(String[] args) {
		Passwortgenerator psw= new Passwortgenerator();
		psw.generate();

	}

}
```

?:bahnhof:


----------



## ARadauer (21. Feb 2012)

@brandy das war ein scherz oder?

@Vulymuz: while (buchstabe < 65) echt?

wildcard hat fast 20000 Beiträge... dem kannst du ruhig vertrauen...



> Das hatte aber vorhin nicht geklappt ...


was hat nicht geklappt?

Wie schon gesagt wurde, würde ich die Klasse Random benutzen...


```
import java.util.Random;


public class Test {
	
	public static void main(String[] args) {
		Random rnd = new Random();
		for(int i = 0; i< 5; i++){
			int value = rnd.nextInt(26)+65; // oder +'A'
			System.out.println((char)value);
		}
	}
}
```

Also konkret... wir wollen zb Zufallszahlen von 5 bis 10. das heißt wir lassen uns zufallszahlen von 0 bis 5 geben und rechnen auf diese immer 5 drauf. Das ist besser als von 0 bis 10 so lange bis die zahl größer als 5 ist...


----------



## Guybrush Threepwood (21. Feb 2012)

Um das ganze noch ein bisschen zu verkomplizieren: Zufallszahlen können einer Verteilung folgen (z. B. normalverteilt). Bei den Buchstaben müsste man das Konzept entsprechnd anpassen. Es würde sich anbieten, die Buchstabenhäufigkeit in der realen Sprache zu berücksichtigen, wobei der Generator dann nicht mehr sprachunabhängig wäre. Die Verteilung der Buchstaben in der deutschen Sprache gibt es hier: Buchstabenhäufigkeit ? Wikipedia


----------



## ARadauer (21. Feb 2012)

> Es würde sich anbieten, die Buchstabenhäufigkeit in der realen Sprache zu berücksichtigen


für ein passwort? eher das gegenteil!


----------



## Vulymuz (21. Feb 2012)

```
public class Passwort {

  int zahl = 0;
  char buchstabe = 65;
  int zahlAnzahl = 0;
  int buchstabenAnzahl = 0;

  public void generatepassword() {
    if (zahlAnzahl < 4) {
      zahl = (int) (Math.random() * 10);
      System.out.print("" + zahl);
      zahlAnzahl = zahlAnzahl + 1;
    }

    if (buchstabenAnzahl < 4) {
      buchstabe = (char) ((Math.random() * 24)+65);
      System.out.print("" + buchstabe);
      buchstabenAnzahl = buchstabenAnzahl + 1;
      generatepassword();
    }
    
  }
}
```

So, gelöst. Danke für den Tipp mit +65. Ich kam ehrlich gesagt schon vorher drauf, wusste aber nicht, wo ich die +65 hinpacken soll ...


----------



## EnHancEd[] (21. Feb 2012)

Hier wäre eine verbesserte Version eines Passwort-Generators..


```
import java.util.Random;
import java.util.Scanner;



class Passwort
{
  public static void main ( String[] args )
  {
    Scanner scan = new Scanner( System.in );
    Random rand = new Random();    
    int digits = 0;
    
    while ( digits < 5 )
    {
      System.out.println("Your password must have at least 5 characters.");
      System.out.print("How many characters do you want in your password? ");
      digits = scan.nextInt();
    }

    String choices = "abcdefghijklmnopqrstuvwxyz" ; // Alphabet wird erzeugt
    choices = choices + choices.toUpperCase() ; // Alphabet auch in Großbuchstaben
    choices = choices + "1234567890" ; // Zahlen werden hinzugefügt


    String password = "";
    int j = 0;
    while ( j<digits )
    {
      password = password + choices.charAt( rand.nextInt( choices.length() ) );
      j = j + 1;
    }
    
    System.out.println("Here is your password: " + password );
  }
}
```

kommen gute Passwörter raus


----------



## Vulymuz (21. Feb 2012)

Dankeschön. Habe meine Version noch mal überarbeitet (siehe vorherigen Post). Wie gesagt, bin ein ziemlicher Anfänger - und für den Anfang gefällt mir mein Passwortgenerator persönlich ganz gut. 

Könnt ihr mir aber bitte sagen, warum folgende Version bei mir nicht funktioniert:


```
public class Passwort {

  int zahl = 0;
  char buchstabe = 65;
  int zahlAnzahl = 0;
  int buchstabenAnzahl = 0;

  public void generatepassword() {
    if (zahlAnzahl < 4) {
      zahl = (int) (Math.random() * 10);
      System.out.print("" + zahl);
      zahlAnzahl = zahlAnzahl + 1;
    }

    if (buchstabenAnzahl < 4) {
      buchstabe = (char) ((Math.random() * 24)+65);
      System.out.print("" + buchstabe);
      buchstabenAnzahl = buchstabenAnzahl + 1;
    }
    
    generatepassword();
    
  }
}
```

Der Unterschied zur vorherigen Version (siehe letzten Post!) ist, dass generatepasswort(); nicht in den geschweiften Klammern von if (buchstabenAnzahl < 4) { } steht, sondern eben danach.


----------



## truesoul (21. Feb 2012)

Naja du erzeugst ein StackOverflow weil die Methode sich jedes mal neu aufruft. 
Im Prinzip wie eine Endlosschleife. 
Deswegen ist es Sinnvoll dafür zu sorgen das eine Methode sich nur so oft aufruft wie nötig.


----------



## Crian (21. Feb 2012)

ARadauer hat gesagt.:


> Wie schon gesagt wurde, würde ich die Klasse Random benutzen...



Nimm doch den Tipp mal auf...


----------



## Vulymuz (21. Feb 2012)

ARadauer hat gesagt.:


> ```
> import java.util.Random;
> 
> 
> ...



Ich verstehe nicht ganz worin der Unterschied zwischen diesem Code und meiner Variante legen soll. Inzwischen habe ich es auch hinbekommen, dass er ebenso kleine Wörter benutzt ...

Also falls ihr mir behilflich sein würdet ...


----------

