# Random() gleiche Zahlen ausschließen



## bad_killa (26. Mai 2011)

hallo,
hab ein kleines problem und zwar möchte ich zufallszahlen in ein array schreiben.
die zahlen sollen zwischen 0-9 sein und dürfen nicht zweimal vorkommen.


```
(int)(Math.random() * 10);
```

bringt mir ja die zufalls zahlen aber wie schließe ich aus das es zweimal oder dreimal die gleiche zahl vorkommt?


----------



## Lodorvonhal (26. Mai 2011)

wie oft willst du den das random ausführen?

ich weis nicht ob es eine Möglichkeit gibt Zahlen auszuschließen.
Ich würde es so machen, das du nach dem Erhalt der Zahl durch das Random einfach vergleichst, ob die Zahl in deinem Array vorhanden ist, wenn ja dann mache weiter : else schreibe in array.

Ist zwar Holzhammer aber egal ^^


----------



## henpara (26. Mai 2011)

Indem zu entweder jedesmal über das Array iterierst und schaust, ob die Zahl schon vorhanden ist, oder indem du die Zahlen erst in eine Collection schreibst und jedesmal schaust, ob die Collection deine gewünschte größe hat. sobald sie die gewünschte größe hat, schreibst du die collection in das array um.


----------



## bad_killa (26. Mai 2011)

das soll der anwender entscheiden können so 3-10 mal also ich möchte damit realisieren das er sich somit aussucht ob er von 10 möglichen fragen 3 bearbeiten möchte oder mehr. damit die frage nicht 2 mal kommt oder dreimal möchte ich es somit ausschließen.


----------



## henpara (26. Mai 2011)

Dann würde ich an deiner Stelle das ganze über ne Collection/Set lösen.
Da kommen nur unterschiedliche zahlen drin vor und über die Mächtigkeit kannst du die maximale Anzahl regeln.

zB das HashSet

lg


----------



## Lodorvonhal (26. Mai 2011)

DU erstellst eine Liste mit der Größe 10 und haust per inc die Zahlen von 1-10 rein.
mit shuffle() 
Java ist auch eine Insel – 11.9 Algorithmen in Collections
mischst du die zahlen.

Bei der Ausgabe der Zahlen reagierst du auf die Nutzereingabe und gibst nur so viele Zahlen aus wie gewünscht.


----------



## ARadauer (26. Mai 2011)

> hab ein kleines problem und zwar möchte ich zufallszahlen in ein array schreiben.
> die zahlen sollen zwischen 0-9 sein und dürfen nicht zweimal vorkommen.


in diesem fall würde ich eine liste von 0-9 machen, mit Collectsions.shuffle mischen und dann einfach mit remove(0) ziehen...


----------



## Luke_ (26. Mai 2011)

du könntest aber auch die tests direkt in ne collection werfen, diese shuffeln und dann nacheinander rausholen.


----------



## bad_killa (26. Mai 2011)

die lösung wäre perfekt aber leider soll ich nur dinge benutzen die wir im unterricht gelernt haben und das ist noch nicht über die anfänge hinweg. sprich die ganzen schleifen, abfragen und so kleine dinge.


----------



## ARadauer (26. Mai 2011)

ja dann solange zufallszahl suchen bis du eine gefunden hast die du noch nicht hast...


----------



## Lodorvonhal (26. Mai 2011)

Lodorvonhal hat gesagt.:


> wie oft willst du den das random ausführen?
> 
> ich weis nicht ob es eine Möglichkeit gibt Zahlen auszuschließen.
> Ich würde es so machen, das du nach dem Erhalt der Zahl durch das Random einfach vergleichst, ob die Zahl in deinem Array vorhanden ist, wenn ja dann mache weiter : else schreibe in array.
> ...



Dann nimm meinen Ersten Vorschlag. Alles mit einfachen Anweisungen und Schleifen zu realisieren. 
Die Ausgabe regelst du über Anzahl der Nutzereingabe


Fertig.


----------



## F.S.WhiTeY (26. Mai 2011)

Das mit dem shuffeln ist ne geniale sache, auch wenn ihr das so noch nicht im unterricht hattet, gibt es ne andere lösung das zu benutzen ohne listen. 

auf dieser seite:
Shuffle an Array or a List - Algorithm in Java

ist eine Algo zum shuffeln für listen und/oder Arrays. 

Damit benutzt du lediglich das was du kannst und hast die selbe lösung.


----------



## Der Müde Joe (26. Mai 2011)

mit boolean array?

```
Random random = new Random();
boolean[] used = new boolean[9];
int rdm = random.nextInt (10); //0 -9
used[rdm] = true;
```


----------



## bad_killa (26. Mai 2011)

habe nun das array befüllt, kann mir nun einer eine unterstützung sagen wie ich prüf das da keine gleichen zahlen drin stehen.


```
int auswahl[];
String abfrage;
int anzahl;
      
abfrage = JOptionPane.showInputDialog("Wieviele Fragen möchten Sie beantworten (3-10)?");
anzahl = Integer.parseInt(abfrage);
    
auswahl = new int[anzahl];
    
for(int i=0; i<=(anzahl-1); i++)  //Befüllen des Arrays
{
auswahl[i] = (int)(Math.random() * 10);
```

wäre für hilfe dankbar bin da noch nicht so gut


----------



## henpara (26. Mai 2011)

Naja du musst vor dem füllen nochmal das Array bis zur aktuellen  stufe durchlaufen und gucken ob bei den vorherigen einträgen dein aktueller dabei ist.


----------



## bone2 (26. Mai 2011)

Der Müde Joe hat doch eine gute und schnelle lösung vorgeschlagen
ein zweites boolean array erzeugen und eine zahl used true setzen wenn man sie hat. vorm reinschreiben in das ergebnis array überprüfen ob die zahl noch false ist


----------



## Naaram (26. Mai 2011)

Ich glaube man sollte ein LinkedHashSet benutzen ca. so:

```
int nBenoetigteZahlen = 5;
LinkedHashSet<Integer> erhalteneZahlen = new LinkedHashSet<Integer>();
while(erhalteneZahlen.size() != nBenoetigteZahlen) {
    erhalteneZahlen.add((int)(Math.random() * 10));
}
```


----------



## bad_killa (26. Mai 2011)

@ Naaram wie gesagt kann nur des einsetzen was im unterricht schon behandelt wurde.
@der müde joe könntest du mir deine idee etwas näher erklären komme nicht ganz dahinter wie das funktioniert


----------



## Andi_CH (26. Mai 2011)

Angenommen du hast das Array von boolean;

1. du genierst eine Randomzahl
2. wenn im array der boolen noch nicht gesetzt ist, boolean setzen und gefundene Zahl zurückgeben
3. wenn im array der boolean gesetzt ist goto 1

Aber pass auf - wenn schon alle Zahlen gezogen sind, hängt das - den Fall musst du noch abfangen

--

Was war der Unterschied zwischen Kopfträger und Kopfnutzer schon wieder ? Aua :autsch:


----------



## bone2 (26. Mai 2011)

```
public static void main(String args[]) {
        int max = 10;

        String abfrage = JOptionPane.showInputDialog("Wieviele Fragen möchten Sie beantworten (3-" + max + ")?");
        int sollAnzahl = Integer.parseInt(abfrage);
        int istAnzahl = 0;

        if (sollAnzahl > max) sollAnzahl = max;
        if (sollAnzahl < 3) sollAnzahl = 3;

        int[] auswahl = new int[sollAnzahl];
        boolean[] used = new boolean[max];

        System.out.print("schleifenzahlen: ");

        while (istAnzahl < sollAnzahl) {
            int temp = (int)(Math.random() * max);
            System.out.print(temp);

            if (! used[temp]) {
                auswahl[istAnzahl] = temp;
                used[temp] = true;
                istAnzahl++;
            }
        }

        System.out.println();
        System.out.println("auswahl:" + Arrays.toString(auswahl));
    }
```


----------



## bad_killa (26. Mai 2011)

@ bones2

habs jetzt nach deiner vorgabe realisiert doch er bringt mir trotzdem 2 gleiche zahlen


----------



## bone2 (26. Mai 2011)

mit max=20 und sollAnzahl = 20 kommt bei mir


```
schleifenzahlen: 51641391913101821601371651711114715941019171711181541618410451717101314016176161645121561416113610207101711181712351314151771008
auswahl:[5, 16, 4, 13, 9, 19, 10, 18, 2, 0, 7, 17, 1, 11, 15, 6, 12, 14, 3, 8]
```


du hast irgendwas falsch übertragen von meinem beispiel


----------



## ARadauer (26. Mai 2011)

weil heute so ein schöner tag ist...


```
import java.util.Arrays;

import javax.swing.JOptionPane;

public class RandomTest {

   public static void main(String[] args) {
      int auswahl[];
      String abfrage;
      int anzahl;

      abfrage = JOptionPane.showInputDialog("Wieviele Fragen möchten Sie beantworten (3-10)?");
      anzahl = Integer.parseInt(abfrage);

      auswahl = new int[anzahl];

      for (int i = 0; i <= (anzahl - 1); i++) // Befüllen des Arrays
      {
         int wert = 0;
         do {
            wert = (int) (Math.random() * 10) + 1;
         } while (contains(auswahl, wert));
         auswahl[i] = wert;
      }

      System.out.println(Arrays.toString(auswahl));
   }

   public static boolean contains(int[] arr, int wert) {
      for (int w : arr) {
         if (w == wert)
            return true;
      }
      return false;
   }
}
```


nur zur info: das sind leichte anfänger beispiele um die grundlagen zu lernen. Falls diese Aufgabe in der Schule gekommen ist, ist es ok. Falls du aber studierst wirs schwierig werden...

ach ja, wer weiß was passiert wenn man 11 eingibt bekommt 100 punkte ;-)


----------



## faetzminator (26. Mai 2011)

ARadauer hat gesagt.:


> ach ja, wer weiß was passiert wenn man 11 eingibt bekommt 100 punkte ;-)



Her mit den 100 Punkten


----------



## Der Müde Joe (26. Mai 2011)

```
(Math.random() * 10) + 1 < 11
```

keks geht auch


----------



## bad_killa (26. Mai 2011)

thx @ bone2 habs nun hinbekommen mit deiner lösung :lol: ne is nur schule  erstes jahr java programmierung. kein student


----------



## bone2 (26. Mai 2011)

hoffe du hast die 5 wichtigen logik zeilen auch verstanden


----------



## jgh (26. Mai 2011)

ARadauer hat gesagt.:


> ach ja, wer weiß was passiert wenn man 11 eingibt bekommt 100 punkte ;-)



100 Punkte will ich haben^^

```
contains(auswahl, wert)
```
 liefert immer true zurück und deswegen hängt das Prog in der do-while-Schleife fest., bzw. beim letzten 11. i-Wert (i=10) der for-Schleife.


----------



## faetzminator (26. Mai 2011)

[c]wert = (int) (Math.random() * 10) + 1;[/c] -> [c]wert = (int) (Math.random() * anzahl) + 1;[/c] 
Aber eigentlich ist dieses Problem viel einfacher lösbar: Erstelle eine Liste mit Inhalt [c]1 - anzahl[/c] und lass [c]Collections.shuffle()[/c] drüber laufen.


----------



## bone2 (26. Mai 2011)

faetzminator hat gesagt.:


> Aber eigentlich ist dieses Problem viel einfacher lösbar: Erstelle eine Liste mit Inhalt [c]1 - anzahl[/c] und lass [c]Collections.shuffle()[/c] drüber laufen.



deshalb wurde die lösung auch shcon 5mal genannt und abgelehnt, weil das das schulwissen übersteigt


----------



## ARadauer (26. Mai 2011)

> Erstelle eine Liste mit Inhalt 1 - anzahl und lass Collections.shuffle() drüber laufen.


wurde schon vorgeschlagen, aber die collection api darf nicht verwendet werden...


----------

