# Keine doppelten Zufallszahlen



## r500 (16. Sep 2013)

Hallo,
habe ein Programm erstellt um Zufallszahlen zu erstellen.
Mit dem Scanner gebe ich an wieviele generiert werden sollen.
Das funkioniert auch soweit ganz alles.

Stehe nun vor folgenden 2 herrausforderungen die ich gern löse möchte:
1. Keine doppelten Zaheln
2. Wie kann ich einen Zahelnbereich begrenzen. also z.B. zaheln nur von 0-10 oder 5-12. das müsste doch iwie bei Math.random passieren oder?


```
public static void main(String[] args) {
	
		Scanner Tastatur = new Scanner (System.in);
		int n; 		//Anzahl der Werte
		System.out.print("Anzahl der Zufallszahlen = ");
		n = Tastatur.nextInt();
		
		// Zufallszahlen erzeugen
		
		double [] werte = new double [n];
	
		for (int i = 0; i < n; i++) {
			werte [i] = (double)(Math.random());
			werte [i] = werte[i] * 10;
			
			System.out.println(Math.round (werte [i]));
		
		}
	}
}
```


----------



## javaDev2011 (16. Sep 2013)

Hi,

erstmal mein kommentierter Code zum Generieren ohne Duplikate:

```
public static void main(String[] args) {

        Scanner Tastatur = new Scanner(System.in);
        int n;      //Anzahl der Werte
        System.out.print("Anzahl der Zufallszahlen = ");
        n = Tastatur.nextInt();

        // Zufallszahlen erzeugen

        double[] werte = new double[n];

        for (int i = 0; i < n; i++) {
            werte[i] = (double) (Math.random());
            werte[i] = werte[i] * 10;
            //schon hier runden => vergleich (ob doppelt) möglich
            werte[i] = Math.round(werte[i]);

            boolean schonInArray = false;
            //alle vorigen werte im array durchgehen
            for (int j = 0; j < i; j++) {
                if (werte[j] == werte[i]) {
                    schonInArray = true;
                    break;
                }
            }

            //bei doppeltem Wert, Schleifendurchlauf wiederholen => Gesamtzahl an Werten bleibt gleich
            if (schonInArray) {
                i--;
                //Nur wenn NICHT doppelt ausgeben
            } else {
                System.out.println(werte[i]);
            }
        }
    }
```

Zum Wertebereich:
Math.random gibt immer werte zwischen 0 und 1, du kannst aber durch Multiplikation wie in Zeile 14 (bei meinem Code) den wertebereich erweitern und ihn durch Addition verschieben.

Indem du z.B. "*50+25" rechnest werden aus werten zwischen 0 und 1, Werte zwischen 25 und 75.

Gruß javaDev2011


----------



## DrZoidberg (16. Sep 2013)

Wenn du keine doppelten Zahlen willst, gibt es verschiedene mögliche Ansätze.
Hier sind mal zwei.
Die erste Methode eignet sich besonders gut für Kartenspiele. Die zweite ist besser, wenn der Zahlenbereich sehr gross ist, aber die Anzahl erzeugter Zahlen klein.


```
private static Random rand = new Random();

public static ArrayList<Integer> zufallsZahlen(int start, int end) {
    ArrayList<Integer> list = new ArrayList<>();
    for(int i = start; i < end; i++) list.add(i);
    Collections.shuffle(list);
    return list;
}

public static ArrayList<Integer> zufallsZahlen(int start, int end, int anzahl) {
    HashSet<Integer> set = new HashSet<>();
    for(int i = 0; i < anzahl; i++) {
        int zahl = rand.nextInt(end-start)+start;
        if(set.contains(zahl)) i--;
        else set.add(zahl);
    }
    return new ArrayList<Integer>(set);
}
```


----------

