# Satz Zufallszahlen ohne Wiederholung



## bicpi (14. Dez 2004)

Wie krieg ich 40 Zufallszahlen von 0 bis 39 in ein Array, wobei sich keine davon wiederholen darf?

Also durcheinander nicht hintereinander 
Und bei Neustart eine andere Folge.


----------



## Reality (14. Dez 2004)

So kriegst du Zufallszahlen:


```
int zufall = (int) (Math.random() * 39);
```

Dann durchläufst du das Array durch. Und wenn keiner der Zahlen übereinstimmt, schiebst du es rein.

Liebe Grüße
Reality


----------



## Griffin (14. Dez 2004)

Also, wenn du 40 Zahlen brauchst UND alle nur von 0 bis 39 UND sie sich nicht wieder holen sollen dann:

```
for (int i = 0; i < 40; i++) {
 meinArray[i] = i;
}
```

Wenn du aber weniger als 40 zahlen hast, dann musst du wirklich das Random benutzen. Und wie Reality schon gesagt hat, überprüfen, ob sich die Zahl bereits im Array befindet.


----------



## L-ectron-X (14. Dez 2004)

Auf jeden Fall per Suchfunktion! Das Thema kam schon einige Male.
Aber um trotzdem eine Antwort zu geben: Hier ein Link zu einem anderen Thread, welcher das behandelte.
Gleich ganz oben. http://www.java-forum.org/de/viewtopic.php?t=10292&start=24


----------



## Wildcard (14. Dez 2004)

bicpi hat gesagt.:
			
		

> Wie krieg ich 40 Zufallszahlen von 0 bis 39 in ein Array, wobei sich keine davon wiederholen darf?
> 
> Also durcheinander nicht hintereinander





			
				Griffin hat gesagt.:
			
		

> Also, wenn du 40 Zahlen brauchst UND alle nur von 0 bis 39 UND sie sich nicht wieder holen sollen dann:
> 
> 
> ```
> ...


 

Würd mal sagen das war nicht ganz Sinn der Sache  :wink:


----------



## bicpi (14. Dez 2004)

Genau, sie müssen ja durcheinander sein 
Und der entscheidende Punkt ist, wie ich prüfe ob sie schon im Array ist, mit den random Sachen komm ich schon ganz gut klar, aber da ich vom seichten PHP her komme weiss ich (noch) nicht so schöne Array-Funktionen wie in_array() oder so, die mich testen lassen, ob die Zahl schon drinne ist.

// EDIT: oder so eine herrliche foreach Schleife oder so


----------



## SebiB90 (14. Dez 2004)

ich glaub es gibt sowas ähnliches wie in_array() nicht
array per for schleife durch laufen und jedes element überprüfen


----------



## Wildcard (14. Dez 2004)

warum ignorierst du L-ectron-X eigentlich?
Links sind zum anklicken!



			
				L-ectron-X hat gesagt.:
			
		

> http://www.java-forum.org/de/viewtopic.php?t=10292&start=24


----------



## bicpi (14. Dez 2004)

Hab ich gar nicht Wildcard, ich hab mich nur daran grad so festgebissen, da die Schleife, die ich dort fand

```
int[] zahlen = new int[6]; 
int x = 0; 

for (int i=0; i<zahlen.length; i++){ 
    do{ 
        x= (int)(Math.random()*49)+1; 
        boolean drin = false; 
        for (int j=0; j<zahlen.length;j++){ 
            if (zahlen[j] == x){ 
                drin = true; 
                break; 
            } 
        } 
    } while(drin); 
    zahlen[i] = x; 
}
```

eich genau das richtige ist, nur produziert sie bei mir im letzten Durchlauf eine endlos-Schleife, so dass ich da grad so drinhing, Sorry


----------



## L-ectron-X (15. Dez 2004)

Ich habe mal just for fun eine Klasse geschrieben, die etwas mehr kann als nur Zufallszahlen auszugeben. Das was bicpi sucht ist jedenfalls möglich.
Zwar deckt sie nur den Integer-Bereich ab, aber das sollte für viele Anwendungsgebiete ausreichen.

```
import java.util.*;

public class Zufallszahlen {
   private boolean duplikateErlaubt;
   private int anzahl, bereichVon, bereichBis;
   private int[] zahlen;

   public Zufallszahlen(int anzahl, boolean duplikateErlaubt, int bereichVon, int bereichBis) {
      if(bereichBis - bereichVon < anzahl && !duplikateErlaubt) {
         System.out.println("Fehler: Die Parameter lassen keine Erzeugung von Zufallszahlen zu!");
         System.out.println("Vergoessern Sie den Wertebereich, verringern Sie die Anzahl der zu\nerzeugenden Zufallszahlen oder lassen Sie Duplikate zu.");
         System.exit(1);
      }
      else {
         zahlen = new int[anzahl];
         this.duplikateErlaubt = duplikateErlaubt;
         this.bereichVon = bereichVon;
         this.bereichBis = bereichBis + 1;
         System.out.println("Ermittlung von "+anzahl+" Zufallszahlen zwischen einschliesslich "+bereichVon+" und "+bereichBis+".");
         if(duplikateErlaubt)
            System.out.println("Dabei sind Duplikate erlaubt.");
         else
            System.out.println("Dabei sind Duplikate nicht erlaubt.");
         zufall();
      }
   }
   
   //Zufallszahlen entsprechend der Vorgaben ermitteln
   private void zufall() {
      int nummero = 0;
      int zahl = 0;
      
      while(nummero < zahlen.length) {
         zahl = (int)(Math.random() * bereichBis);
         if(zahl < bereichVon)
            continue;
         else {
            zahlen[nummero] = zahl;
            if(!duplikateErlaubt) {
               for(int i = 0; i < nummero; i++) {
                  if(zahlen[i] == zahl)
                     nummero--;
               }
            }
         }
         nummero++;
      }
   }
   
   //Zufallszahlen aufsteigend sortieren
   public void sortieren() {
      Arrays.sort(zahlen);
   }
   
   //Textausgabe der Zufallszahlen auf der Console
   public void ausgeben() {
      for(int i = 0; i < zahlen.length; i++)
         System.out.print(zahlen[i]+"  ");
      System.out.println();
   }
   
   //Die Zufallszahlen in einem Array an den Aufrufer zurück geben
   public int[] zurückgeben() {
      return zahlen;
   }
   
   public static void main(String[] args) {
      //Ein kleiner Test
      Zufallszahlen z = new Zufallszahlen(10, false, 10, 50);
      z.ausgeben();
      z.sortieren();
      z.ausgeben();

   }
}
```
Allerdings klingt das was bicpi vor hat eigentlich nur nach "Mische die Zahlen von 0 bis 39".
Auch das ist mit dem Programm möglich.


----------



## Wildcard (15. Dez 2004)

Find ich ne gute Idee.
Kann man vieleicht irgendwo bei FAQ oder so unterbringen.
Werden dir bestimmt einige Leute sehr dankbar sein.  :toll:


----------



## Bleiglanz (15. Dez 2004)

wie wärs mit

java.util.Collections.shuffle(List list)


----------



## Reality (15. Dez 2004)

L-ectron-X hat gesagt.:
			
		

> Zwar deckt sie nur den Integer-Bereich ab, aber das sollte für viele Anwendungsgebiete ausreichen.


Hier wären Generics wieder gut, was du ja nicht so magst. 

Liebe Grüße
Reality


----------



## L-ectron-X (15. Dez 2004)

hehe, ja (noch) nicht so sehr.
Aber vielleicht schreibst Du ja mal ein passendes Beispiel. So kann ich ja auch noch was lernen. :wink:


----------



## Reality (15. Dez 2004)

He, nö. Bin doch (noch) nicht so gut darin. 
Weiss nur, dass man class Bla<T extends Number> machen muss, damit das auch eine Number-Klasse wie Integer oder Double sein muss, die instantiiert wird.

Liebe Grüße
Reality


----------

