# Zufallsliste ohne Wiederholungen erstellen



## ryoshi (1. Mai 2006)

Hallo an die alt eingessenen Javaprogrammierer 

Nachdem ich schon überall danach gesucht habe, aber irgendwie aus keinem Suchergebnis schlau geworden bin wollt ich einfach hier mal nachfragen.

Ich habe versucht eine Zahlenliste zu erstellen in dem 25 Zufallszahlen untereinander aufgereiht sind. Dies ist im Prinzip auch nicht sehr schwierig, doch sollte keine Zahl zwei Mal vorkommen. Diese Wiederholungen bekomm ich einfach nicht weg.

Vielleicht kann ja jemand einfach die nötige Ergänzung zu meinem Code posten, die nötig ist um dieses Problem zu beheben, oder vielleicht hat jemand ja auch einen eleganteren Lösungsweg.


```
import java.util.Random;

public class Zufallsliste 
{
    public void zufallsZahlenAusgeben() 
        {

        Random zufallsgenerator;
        zufallsgenerator = new Random();

        for(int i=1; i<=25; i++)
            {
            int index = zufallsgenerator.nextInt(25);
            System.out.println(index);
            }
        }
}
```

Wäre euch sehr dankbar 

Gruß ryoshi


----------



## SebiB90 (1. Mai 2006)

damit du keine wiederholungen kriegst musst du zuerst die zufallszahlen speichern,z.b. in einem array und dann nachgucken ob die zahl vorhanden ist.



```
import java.util.Random; 

public class Zufallsliste 
{ 
    public void zufallsZahlenAusgeben() 
        { 

        Random zufallsgenerator; 
        zufallsgenerator = new Random(); 
        int[] zufallszahlen = new int[25];//array fürdie zufallszahlen

        for(int i=0; i<25; i++) 
            { 
            boolean doppelt = false; //hilfsvariable ob zahl doppelt ist
            do {
              int index = zufallsgenerator.nextInt(25); 
              //array durchlaufen und prüfen ob zahl schon vorhanden ist
              for(int j = 0; j < i; j++) {
                if(zufallszahlen[j] == index) {
                  doppelt = true;//zahl ist vorhanden, hilfsvariable auf true setzen
                  break; //schleife abbrechen
                }
              }
            }while(doppelt);//wenn zahl doppelt ist nochmal neue zufallszahl generieren bis nicht mehr doppelt ist
            System.out.println(index); 
            zufallszahlen[i] = index;//zahl ins array abspeichern
            } 
        } 
}
```


----------



## ryoshi (1. Mai 2006)

erstmal danke für die schnelle antwort 

ich hab das ganze mal compilieren lassen und hab dann die variable "index" schonma vordeklariert, weil sie sonst in der while schleife unten nicht erkannt wird. beim ausführen jedoch hängt sich das ganze auf und zwar nach 10 zahlen bzw. er gibt nur  10 zahlen aus und arbeitet dann weiter... hab das ganze mit BlueJ probiert.


----------



## SebiB90 (1. Mai 2006)

ahjo -.-
index muss vorher deklariert werden

hm.. es könnte sein das nach 10 zahlen nur doppelte kommen aber das kann nicht wirklich sein
schau dir mal arraylist an, da könntest du einfach die zahlen 1 bis 25 hinzufügen und dann per Collections.shuffle(list) mischen, dann haste auch ne zufällige reihenfolge


----------



## Redfrettchen (1. Mai 2006)

Hi,
die oben vorgestellte Methode eine beliebige Kombination von Zahlen zu erhalten ist nicht gerade die eleganteste.
Entweder man geht den Umweg über die Collection oder man programmiert das selbst aus:
Die Idee dahinter ist, dass man sich alle vorkommenden Zahlen als Zahlenarray vorgibt und bloß die Positionen zufällig vertauscht.

```
int[] arr = new int[25];
for (int i=0; i<arr.length; i++) {
    arr[i] = i;
}
Random gen = new Random();
int pos;
int hilf;
for (int i=0; i<arr.length; i++) {
    pos = gen.nextInt(arr.length-i)+i;

    hilf = arr[i];
    arr[i] = arr[pos];
    arr[pos] = hilf;
}
```

Das geht natürlich auch mit beliebigen Objektarrays.


----------



## ryoshi (1. Mai 2006)

jo ich habs jetzt mit dem shuffle gemacht und das funktioniert auch sehr gut 
nur ergibt sich jetzt das problem das ich die ArrayList irgendwie nicht per knopfdruck in ein textfeld mit AWT schreiben kann... ich hab dann versucht das ganze in einen string zu konverten aber das scheitert :/


----------



## SebiB90 (1. Mai 2006)

ryoshi hat gesagt.:
			
		

> jo ich habs jetzt mit dem shuffle gemacht und das funktioniert auch sehr gut
> nur ergibt sich jetzt das problem das ich die ArrayList irgendwie nicht per knopfdruck in ein textfeld mit AWT schreiben kann... ich hab dann versucht das ganze in einen string zu konverten aber das scheitert :/


wo haste denn probleme, zeig mal bischen code.
eigentlich ist das ganz einfach, mit einer for(each) schleife die liste durchlaufen und dann mit nem StringBuffer den String zusammen basteln.


----------



## ryoshi (1. Mai 2006)

jo also das ganze soll auf knopfdruck (mouse_clicked) geschehen..


```
ArrayList a = new ArrayList();

    for ( int i = 1; i <= 25; i++ )
      a.add( "" + i );

    Collections.shuffle(a);
```
er erstellt also auf knopfdruck eine ArrayList und soll die dann mit hilfe von textFeld.setText(String); in das textfeld schreiben und das klappt nicht.. weil er angeblich keine ArrayList in ein AWT Textfeld schreiben kann :/
der rest mit der ArrayList funktioniert super & mit System.out.println ist das Ausgeben auch kein Problem


----------



## Redfrettchen (1. Mai 2006)

Warum sollte er auch eine ArrayList in ein Textfeld schreiben? Stell dir vor jemand füllt eine ArrayList mit hochkomplizierten Objekten, was soll das Textfeld mit denen machen? Die Methode setText(String) nimmt eben nur einen String an, kein StringBuffer, keine ArrayList<String> oder was auch immer. Du musst aus dem Inhalt deiner Collection also in einen String bringen, eben auf dem Weg, den SebiB90 schon angedeutet hat. Wie du auf die Element der ArrayList zugreifst, hast du ja anscheinend schon rausgefunden, du musst also bloß noch in Erfahrung bringen, wie man die einzelnen Elemente in einen String verknüpft.
Fürs erste kannst du es ja auch mit dem +-Operator von String machen, was allerdings nicht so performant ist, weil intern ein komplett neuer String erzeugt wird.

Ich hoffe das waren jetzt genug Hinweise ;-)


----------



## ryoshi (1. Mai 2006)

wie ich eben herausgefunden habe geht das alles doch viel einfach als ich gedacht habe 

```
ArrayList a = new ArrayList();

    String s = tFMannschaften.getText();
    int anzahl = Integer.parseInt( s );

    for ( int i = 1; i <= anzahl; i++ )
    a.add( "" + i );

    Collections.shuffle(a);
    textAusgabe.setText(a.toString());
```
so habe ich eine variable anzahl und bekomme es auch in mein textfeld
ich bedanke mich trotzdem bei euch beiden für eure hilfe


----------

