# (Math.random()*49) zahl darf aber nur einmal gezogen werden



## Rouven50 (9. Jun 2011)

hey ich steh grad total aufm schlauch… ich weiß einfach nicht wie ich das lösen kann das wenn man zb 6 zufällig erzeugte zahlen zieht, dass die zahl aber nur einmal aufgerufen wird.


als erstes habe ich ein array erzeugt wo die werte drin gespeichert werden

```
int zahl;
		int [] zahlen = new int[6];
		for(int a=0;a<zahlen.length;a++){
			zahl =(int)((Math.random())*6)+1;
			zahlen[a] = zahl;
                        //hier
		}
```

aber jetzt muss man ja wo "hier" steht wieder eine schleife einbauen die testet ob die zahl bereits vorhanden ist das hab ich mir so gedacht:


```
int zahl;
		int [] zahlen = new int[6];
		for(int a=0;a<zahlen.length;a++){
			zahl =(int)((Math.random())*6)+1;
			zahlen[a] = zahl;
                        for(int b=0;b<a;b++){
                             if(zahlen[b] == zahl){
                                 zahl =(int)((Math.random())*6)+1;
                                 zahlen[b] = zahl;
                             }
                        }
                  IO.print(zahlen[a]);
		}
```

aber das geht ja auch nicht weil man dann wieder erneut prüfen müsste ob zahlen* == zahl und für die bereits geprueften elemente müsste man das auch nochmal machen…

oder man müsste die 2 arrays haben wo man einmal alle erlaubten werte drin speichert und dann noch ein array wo man den zufällig erzeugten array-inhalt übergibt und den dann zb auf 0  setzt und dann sagt das nur werte die nicht 0 sind erlaubt sind…
aber an der umsetzung hapert es noch*


----------



## Gast2 (9. Jun 2011)

Die Forensuche hätte dir hier bestimmt weitergeholfen, das wurde schon sehr oft behalndelt:

```
public static void main(String[] args) {
		List<Integer> allNumbers = new LinkedList<Integer>();
		for (int i = 1; i <= 49; i++) {
			allNumbers.add(i);
		}
		
		Collections.shuffle(allNumbers);
		
		List<Integer> numbers = allNumbers.subList(0, 6);
		System.out.println("Gezogene Zahlen: " + numbers);
	}
```
Oder du nimmst die Variante mit dem Set.


----------



## Marcinek (9. Jun 2011)

Es gibt zu diesem Thema bereits 100 Lösungen in diesem Forum ;D


----------



## thorstenthor (9. Jun 2011)

Keine Doppelten?


```
int[] arr = new int[6];
for (int i = 0; i < arr.length; i++) {
  int z = (int) (Math.random() * 6.0) + 1;
  int j = 0;
  while (j < i) {
    if (arr[j] == z) {
      break;
    }
  }
  if (j == i) {
    arr[i] = z;
  } else {
    i--;
  }
}
```

oder eine intelligente Datenstruktur wählen.


----------



## Rouven50 (9. Jun 2011)

endet bei mir in einer endlosschleife die zufallszahlen 1-6 hab ich nur testweise genommen… soll für eine beliebige zahlengröße gelten


----------



## thorstenthor (9. Jun 2011)

Etwas vergessen gehabt:


```
int[] arr = new int[6];
        for (int i = 0; i < arr.length; i++) {
            int z = (int) (Math.random() * 6.0) + 1;
            int j = 0;
            for (; j < i; j++) {
                if (arr[j] == z) {
                    break;
                }
            }
            if (j == i) {
                arr[i] = z;
            } else {
                i--;
            }
        }
        System.out.println(Arrays.toString(arr));
```

Eine Datenstruktur, die keine doppelten Elemente erlaubt, ist wirklich besser - oder eine, wo Kandidaten raus gewählt werden.


----------



## Rouven50 (9. Jun 2011)

ah danke..ja das reicht erstmal..dankeschön


----------



## Rouven50 (9. Jun 2011)

noch eine frage..wieso wird die ausgabe in eckigen klammern angezeigt?


----------



## thorstenthor (9. Jun 2011)

Manche finden auch das besser (lesbarer):


```
int[] arr = new int[6];
        for (int i = 0; i < arr.length;) {
            int z = (int) (Math.random() * 6.0) + 1;
            boolean b = true;
            for (int j = 0; b && j < i; j++) {
                if (arr[j] == z) {
                    b = false;
                }
            }
            if (b) {
                arr[i] = z;
                i++;
            } else {
                //pause
            }
        }
        System.out.println(Arrays.toString(arr));
```

Oder nur while-Schleifen etdc.

java.util.Arrays.toString# erstellt einen speziellen String....


----------



## thorstenthor (9. Jun 2011)

Oha, wieder ein Fehler, im else-Zweig nicht dekrementieren, i unverändert lassen, denn i bleibt so.


----------



## Rouven50 (9. Jun 2011)

ok dankeschön… ich guck mir das morgen mal inruhe an..irgendwie bin ich heute zu matschig dafür^^ schönen abend noch


----------



## thorstenthor (9. Jun 2011)

```
List<Integer> list = Arrays.asList(new Integer[]{1, 2, 3, 4, 5, 6});
        Collections.shuffle(list);
        System.out.println(list);
```

verlier auch solche Möglichkeiten nicht aus den Augen, es kommt darauf an, wie viele Zahlen aus wie vielen Zahlen genommen werden sollen.


----------

