# Zufällige Buchstaben



## JUser01 (2. Nov 2015)

Hallo,

ich bin ein absoluter Einsteiger in Sachen Programmierung und damit auch in Java.

Ich wollte mal wissen, ob es eine !einfache! Methode für die Generierung von zufälligen Buchstaben gibt (sowie math.Random bei Zahlen).

Ich weiß, dass es schon einige Themen über das Thema gibt, jedoch war das immer ganz schön kompiliziert für Einsteiger.


----------



## stg (2. Nov 2015)

Zum Beispiel so:

```
Random random = newRandom();
char c = (char) (random.nextInt(26)+'a');
```
*c *ist nun ein zufälliger Buchstabe im Bereich von a bis z


----------



## JUser01 (2. Nov 2015)

Vielen Dank. Das ist mal kurz und präzise zum lernen. 

Aber eine Frage noch: erkennt Java dann automatisch, dass die Buchstaben von A-Z gemeint sind? Du hast nirgends irgendwas von Z zu stehen. 

Frage nur, damit ich es auch richtig verstehe.


----------



## Tarrew (2. Nov 2015)

'a' hat den ASCII-Wert 97. Random.nextInt(26) gibt dir eine Zahl im Bereich von 0-25. Der maximale Wert den du kriegen kannst ist also 97+25=122. Und 122 ist der ASCII-Wert für 'z'. Und dazwischen liegen die anderen Buchstaben.
Die Großbuchstaben haben ASCII-Werte von 65 bis 90, falls du die auch irgendwie verwenden willst.


----------



## JUser01 (2. Nov 2015)

Ja wollte ich. Ersetze ich dann einfach (in dem Quellcode) die 26 durch die 90 und erhalte dann Groß- und Kleinbuchstaben?

Super Erklärung. Vielen Dank.


----------



## Tarrew (3. Nov 2015)

Wenn du die 26 durch die 90 ersetzt erhältst du ASCII-Werte zwischen 97 und 186. Und in dem Bereich liegen deine Großbuchstaben ja nicht.

Sowas würde gehen:

```
char c = random.nextInt(2) == 1 ? (char)(random.nextInt(26)+'a') : (char)(random.nextInt(26)+'A');
```
Man kriegt zuerst eine zufällige Zahl die entweder 0 oder 1 ist. Wenn es eine 1 ist dann wird ein zufälliger Kleinbuchstabe generiert und sonst ein Großbuchstabe.


----------



## Flown (3. Nov 2015)

@Tarrew Random besitzt die Methode `Random::nextBoolean`


----------



## Tarrew (3. Nov 2015)

Danke, dann wäre es so besser:

```
char c = random.nextBoolean() ? (char)(random.nextInt(26)+'a') : (char)(random.nextInt(26)+'A');
```


----------



## JUser01 (3. Nov 2015)

Ok danke. 

Und wofür steht das Fragezeichen?


----------



## JStein52 (3. Nov 2015)

```
char c = random.nextBoolean() ? (char)(random.nextInt(26)+'a') : (char)(random.nextInt(26)+'A');
```

ist die verkürzte Schreibeweise für:


```
char c;
if (random.nextBoolean() == true)
   c = (char)(random.nextInt(26)+'a');
else
   c =  (char)(random.nextInt(26)+'A');
```


----------



## Flown (3. Nov 2015)

Das ist der tenräre Operator: TUTORIAL


----------



## JUser01 (3. Nov 2015)

Ok 

Also welche Zahl muss immer in die Klammern (bei der 26)? Der Maximalwerte oder wie?


----------



## JStein52 (3. Nov 2015)

int nextInt( int range ) Liefert eine int-Pseudo-Zufallszahl im Bereich von 0 bis range.

So stehts zumindest in Java ist auch eine Insel. Ich glaube aber es muss heissen:

int nextInt( int range ) Liefert eine int-Pseudo-Zufallszahl im Bereich von 0 bis range-1  .


----------



## JUser01 (3. Nov 2015)

Ok,

habe gerade den Code mal im Programm eingeben. Es kommt nur eine Fehlermeldung. Muss ich noch irgendetwas importieren oder so? 

Ich weiß es sind viele dumme Fragen..


----------



## Tarrew (3. Nov 2015)

Hast du davor geschrieben:

```
Random random = new Random();
```
??


----------



## JStein52 (3. Nov 2015)

Und das:

import java.util.Random;

brauchst du auch


----------



## JUser01 (3. Nov 2015)

```
import java.util.Random;


public class ZufallsBuchstabe {

    public static void main(String[] args) {
   
       
        Random random = newRandom;
       
        char c = random.nextBoolean() ? (char)(random.nextInt(26)+'a') : (char)(random.nextInt(26)+'A');
       

    }

}
```

Als Fehler zeigt er an: "newRandom cannot be resolved to a variable"

Stelle mich wahrscheinlich zu doof an.


----------



## JStein52 (3. Nov 2015)

Ja, mach mal ein Blank hinter new !! Und schreib Random();


----------



## JUser01 (3. Nov 2015)

Also dann =new Random();


----------



## JStein52 (3. Nov 2015)

Genau


----------



## JUser01 (5. Nov 2015)

Zur Vollständigkeit:
Welche Zahl muss ich bei der "26" eingeben, um ein zufälliges Sonderzeichen zu erhalten, bzw. was muss ich allgemein ändern?


----------



## Tarrew (5. Nov 2015)

Die Zahlen ergeben sich aus Start und Endwert.
'a' hat den Wert 97 und das Alphabet hat 26 Buchstaben. Deswegen die 26.

Du kannst dir ja mal eine ASCII Tabelle angucken und gucken in welchem Bereich deine gewünschten Sonderzeichen liegen. Wenn die jetzt weit verstreut auseinander liegen kannste die vermutlich besser in ein Array einfügen und dann ein zufälliges Element des Arrays auswählen.


----------



## JUser01 (6. Nov 2015)

Es sind die Zeichen von 58-64.


----------



## Tarrew (6. Nov 2015)

Dann weißt du ja welche Zahlen du einsetzen musst


----------



## JUser01 (6. Nov 2015)

Habe die Zahlen jetzt eingetragen. Wird sehr wahrscheinlich falsch sein, aber es kommen Zeiche bei raus. Leider auch Buchstaben. 


```
Random random = new Random();
       
        char c = random.nextBoolean() ? (char)(random.nextInt(58)+':') : (char)(random.nextInt(64)+'@');
       
        System.out.println(c);
```


----------



## JStein52 (6. Nov 2015)

Es kommen jetzt ab dem ":" die naechsten 58 Zeichen und ab dem "@" die naechsten 64 Zeichen. Ich glaube das wolltest du nicht


----------



## Tarrew (6. Nov 2015)

```
char a = (char)(random.nextInt(7)+':');
```

Du solltest dir nochmal genau angucken was bei deinen Code rauskommt.
random.nextInt(58) gibt dir Zahlen zwischen 0-57 und darauf addierst du dann immer ':' (58).

Also kriegst du für  "(char)(random.nextInt(58)+':')" Werte im Bereich von 58-115.


----------



## JUser01 (6. Nov 2015)

Das glaube ich auch..

Wenn ich das folgende eingebe, zeigt er mir den Fehler "Syntax error, ": Expression to complete Expression"


```
Random random = new Random();
       
        char c = random.nextBoolean() ? (char)(random.nextInt(6)+':');
       
        System.out.println(c);
```


----------



## JStein52 (6. Nov 2015)

Ja, du kannst dir in dem Fall das mit dem nextBoolean usw. schenken weil du ja nur Zeichen aus einem einzigen Intervall haben willst. Machs mal so wie @Tarrew vorgeschlagen hat.

Nur zu deinem Verständnis: das mit dem nextBoolean diente mal dazu zunächst auszuwählen ob du Gross- oder Kleinbuchstaben haben willst, der Rest dann dazu irgendeinen Wert aus einem der beiden Intervalle rauszusuchen.


----------



## JUser01 (6. Nov 2015)

Ok hat geklappt, danke!

Wo wir schon bei Zufällen sind, gibt es eine Möglichkeit (für Anfänger), Werte zufällig auszugeben. Also wenn ich zum Beispiel 4 Integer habe und die immer wieder in verschiedenen Reihenfolgen auszugeben?

Ich weiß, dass es nicht mehr zur Überschrift passt.


----------



## JStein52 (6. Nov 2015)

Und wenn du dann am Ende alles zusammen haben willst dann würfelst du zunächst eine Zahl von 0 .. 2 die dann eines der 3 Intervalle festlegt. Und anschliessend (d.h. mit entsprechenden if oder switch - Anweisungen) würfelst du eine Zahl aus dem jeweiligen Intervall.


----------



## JStein52 (6. Nov 2015)

Ja, klar. Du schreibst diese 4 Werte in ein int[4] - Array und würfelst einen Index zwischen 0 .. 3  und gibst den Inhalt des Arrays an dieser Stelle aus !!


----------



## JUser01 (6. Nov 2015)

Kannst du mal bitte zum Erklären und zur Veranschaulichung ein Beispiel Code geben?


----------



## JStein52 (6. Nov 2015)

So etwa:


```
Random random = new Random();
int[] zahlen = {3,6,4,18};
     
        int index  = random.nextInt(3);
     
        System.out.println(zahlen[index]);
```

Das gibt dir eine der Zahlen 3,6,4,18 zufällig aus.  du kannst jetzt eine Schleife drumrum machen und kriegst diese 4 Zahlen dann zufällig ausgegeben


----------



## JUser01 (6. Nov 2015)

Ok danke.

Wofür steht die 3 beim index?


----------



## JStein52 (6. Nov 2015)

Du hast recht das muss eine 4 sein !!  Das steht für eine Zufallszahl von 0 .. 3 !!

nextInt(number)  liefert eine Zufallszahl von 0 .. number-1


----------



## JUser01 (6. Nov 2015)

Das heißt, wenn ich 5 Zahlen zufällig ausgegeben haben möchte, muss in diese Klammer beim Index auch eine 5?


----------



## Tarrew (6. Nov 2015)

Wenn in deinem Array die 5 Zahlen sind, dann ja.


----------



## JUser01 (6. Nov 2015)

Also an deinem Beispiel schon?!


----------



## Tarrew (6. Nov 2015)

Musst zu dem Array halt eine 5. Zahl hinzufügen. 

Oder willst du allgemein nur 5 zufällige Zahlen ausgeben? Also 5 Zahlen aus dem Bereich 0- 10.000 oder so?


----------



## JStein52 (6. Nov 2015)

Du kannst es so machen, dann passt es immer:


```
Random random = new Random();
int[] zahlen = {3,6,4,18};
    
        int index  = random.nextInt(zahlen.length);
    
        System.out.println(zahlen[index]);
```

Und wenn du jetzt in das zahlen-array mehr Zahlen in die geschweiften Klammern schreibst stimmt es immer


----------



## JUser01 (7. Nov 2015)

Ok. Und kann ich die Zahlen auch durch Variablen ersetzen? Also wenn zum Beispiel der Benutzer etwas eingeben soll und diese Zahlen dann zufällig ausgeben werden sollen.


----------



## Thallius (7. Nov 2015)

An dieser Stelle möchte ich doch mal darauf verweisen, dass es auch sowas wie Grundlagenwissen gibt, dass man sich auch selbständig aneigenen kann. Dafür gibt es Bücher (Diese Dinger aus viel Papier die man aufklappen und umblättern kann) oder auch Internet-Tutorials oder sogar Videos falls das Lesen schwer fällt.

Gruß

Claus


----------



## JUser01 (7. Nov 2015)

Ja danke für den Tipp. Aber wie gesagt ich bin Anfänger und immer noch dabei mir das Wissen anzueignen.


----------



## JStein52 (7. Nov 2015)

Ja klar. Du musst dieses zahlen-array ja nicht per Initialisierung mit Werten füllen so wie ich es gemacht habe. Du kannst natürlich auch Zahlen von der Konsole einlesen und diese Werte in das Array schreiben. Und anschliessend einen Index in diesem Array würfeln.


```
Random random = new Random();
int[] zahlen = new int[4];

        // hier liest du jetzt Zahlen von der Konsole ein und
        // schreibst sie in das array
        int i = 0;
        while (benutzer gibt eine Zahl ein) {
              zahlen[i++] = benutzerzahl;
        }
  
        int index  = random.nextInt(zahlen.length);
  
        System.out.println(zahlen[index]);
```

Achtung: das ist nur rudimentärer Code. Du musst dir überlegen wieviele Zahlen du einlesen willst und das Array entsprechend gross machen. Oder mit einer Integer-Liste arbeiten zu der du Werte hinzufügst.
Das oben ist nur ein Denkanstoss


----------



## JUser01 (7. Nov 2015)

Ok danke


----------

