# Zufallszahlen fuer Lotto generieren



## Pupsicat (27. Okt 2010)

Hallo,

versuche Zufallszahlen fuer lotto zu generieren.
Welche Methode nehme ich da und wie wende ich sie an????:L


----------



## Gast2 (27. Okt 2010)

Kommt drauf an was ihr nutzen dürft:
- eigene Methode schreiben: solange zufallszahlen ziehen bis man 6 verschiedene hat
- List mit allen Zahlen füllen, shufflen, die ersten 6 zahlen nehmen

EDIT:
http://www.java-forum.org/java-basi...33-do-while-befehl-verkuerzen.html#post677043
Dieser Ansatz von Landei kann man sich in dem zusammenhang auch mal anschaun.


----------



## Firephoenix (27. Okt 2010)

Eigentlich bin ich davon ja kein Fan aber:
Let me google that for you

java-forum.org - Foren durchsuchen

Random (Java Platform SE 6)

um nur mal ein paar Hilfsmittel zu nennen


----------



## Landei (28. Okt 2010)

Um EikeBs Antwort etwas auszuführen:

Eine List mischt man mit java.util.Collections.shuffle(list)

Will man selber "ziehen", bietet sich ein Set an:

```
Random random = new Random();
Set<Integer> set = new HashSet<Integer>();
while(set.size() < 6) {
   set.add(random.nextInt(49) + 1);
}
```

Man kann auch erst eine Zahl von 1 bis 49 ziehen, dann eine von 1 bis 48 und "korrigieren" (eins addieren wenn sie größer/gleich der ersten ist, dann eine von 1 bis 47 ziehen, gegenüber den ersten zwei Zahlen "korrigieren" u.s.w.


----------



## mariusbopp (28. Okt 2010)

ich würds mit 
Math.random();
machen oder is das nicht passend an der stelle??


----------



## mariusbopp (28. Okt 2010)

mariusbopp hat gesagt.:


> is das nicht passend an der stelle??



okay hab mir meine frage grade selber beantwortet...


----------



## c_sidi90 (28. Okt 2010)

würde einfach ein Int[] Array erzeugen und das mit 6 Zufallszahlen fühlen und beim ziehen der Zahl auf richtigkeit prüfen.


----------



## Gast2 (28. Okt 2010)

c_sidi90 hat gesagt.:


> würde einfach ein Int[] Array erzeugen und das mit 6 Zufallszahlen fühlen und beim ziehen der Zahl auf richtigkeit prüfen.


Geht mit einem Set aber deutlich eleganter


----------



## c_sidi90 (28. Okt 2010)

Seh da kein großen Vorteil drin, denke soll er einfach für sich entscheiden was ihm besser gefällt.


----------



## SlaterB (28. Okt 2010)

Landei hat gesagt.:


> Man kann auch erst eine Zahl von 1 bis 49 ziehen, dann eine von 1 bis 48 und "korrigieren" (eins addieren wenn sie größer/gleich der ersten ist, dann eine von 1 bis 47 ziehen, gegenüber den ersten zwei Zahlen "korrigieren" u.s.w.


also +1 ist ja nicht so schön,
wenn als erstes die 3 gezogen wurde hat danach die 4 eine doppelt so hohe Chance wie alle anderen Zahlen,
wieso eigentlich nur noch 1-48, 1-47 usw, sind die hohen Zahlen nicht mehr erlaubt?

---

das Thema gibts ja öfter hier, eine sehr schöne Variante für 'ohne Doppelte' ist dabei doch immer:
eine Liste mit 1-49 füllen, dann durchmischen, Collections.shuffle(),
und dann die ersten 6 Zahlen verwenden (edit: ok, schon genannt, wollte aber nicht nur meckern  )


----------



## ARadauer (28. Okt 2010)

c_sidi90 hat gesagt.:


> Seh da kein großen Vorteil drin, denke soll er einfach für sich entscheiden was ihm besser gefällt.



der Vorteil, ist dass du nicht dauern über dein array laufen musst um zu sehen ob die zahl schon drinnen ist. In einem Set sind die Elemente einzigartig, das heißt du kannst einfügen bis 6 Elemente drinnen sind (wie oben gezeigt) und kannst dir sicher sein, dass die zahlen unterschiedlich sind.


----------



## Gast2 (28. Okt 2010)

SlaterB hat gesagt.:
			
		

> also +1 ist ja nicht so schön,
> wenn als erstes die 3 gezogen wurde hat danach die 4 eine doppelt so hohe Chance wie alle anderen Zahlen,
> wieso eigentlich nur noch 1-48, 1-47 usw, sind die hohen Zahlen nicht mehr erlaubt?


Dachte ich auch zuerst, aber ich wurde eines besseren belehrt 
siehe:
http://www.java-forum.org/java-basi...33-do-while-befehl-verkuerzen.html#post677055
ff.

EDIT:
da haste wohl zu langsam gelöscht^^


----------



## SlaterB (28. Okt 2010)

jaja, so langsam kapier ichs auch, dann un-lösche ich mal meinen Beitrag


----------



## mariusbopp (28. Okt 2010)

also ich erzeuge so 6 zufallszahlen zwischen 1 und 49
bisschen gegoogelt und das kam raus :


```
package zufallszahlen;
public class Main
{
    public static int zufaelligeZahl(int n) {
    double dezimalZahl = Math.random();
    int ganzZahl = (int)Math.round( dezimalZahl * n );
    return ganzZahl;

    }
    public static void main( String[] args )
    {
       for(int i=0; i<6; i++){
        int zufall = zufaelligeZahl(49);
         System.out.println("Zufaellige Zahl: " + zufall);
         }//ende for
    }//ende public static void main( String[] args )
}//ende public class Main
```


----------



## ARadauer (28. Okt 2010)

nja marius... nicht ganz richtig



> Zufaellige Zahl: 31
> Zufaellige Zahl: 49
> Zufaellige Zahl: 14
> Zufaellige Zahl: 3
> ...



statt Math.random(); sollte man die Klasse Random werwenden.


----------



## mariusbopp (28. Okt 2010)

kannst du mir kurz den unterschied erläutern?


----------



## mariusbopp (28. Okt 2010)

mir stellt sich grade eine frage die vill ach zu dem thema passen könnte nehmen wir an ich schreibe 6 zahlen (vom user eingegeben) ind ein array
dann fülle ich ein 2tes array mit zufallszahlen

und könnte ich dann sagen vergleiche mir array 1 mit array 2??


----------



## ARadauer (28. Okt 2010)

> und könnte ich dann sagen vergleiche mir array 1 mit array 2??


ja natürlich, 


```
int[] a1 = {12,2,5};
      int[] a2 = {12,2,5};      
      System.out.println(Arrays.equals(a1, a2)); // richtig: da die elemente verglichen werden
      System.out.println(a1.equals(a2)); //falsch: da die referenzen verglichen werden
```


----------



## mariusbopp (28. Okt 2010)

okay danke:toll:


----------



## Landei (28. Okt 2010)

SlaterB hat gesagt.:


> also +1 ist ja nicht so schön,
> wenn als erstes die 3 gezogen wurde hat danach die 4 eine doppelt so hohe Chance wie alle anderen Zahlen,
> wieso eigentlich nur noch 1-48, 1-47 usw, sind die hohen Zahlen nicht mehr erlaubt?


Nein, hat die vier nicht. Wenn ich die 3 ziehe, wird die nächste Zahl erhöht, wenn sie *größer *oder gleich 3 ist. Wenn ich also als nächstes eine 48 ziehe, wird daraus eine 49.

Die Reihenfolge ist aber wichtig, bei dem Verfahren müssen die Zahlen immer aufsteigend geordnet sein. Bei einer neuen Zahl geht man dann alle vorherigen durch, und erhöht, wenn sie *größer* oder gleich ist. Damit kann ich keine doppelten Werte erhalten, und wenn ich aus 49,48,47... ziehe auch nie einen "Überlauf".


----------



## Andi_CH (28. Okt 2010)

Ich gebs zu, ich habe nicht jedes Detail nachgelesen, aber wenn die nächste zu ziehende Zahl grösser sein muss als die grösste bisher gezogene Zahl, erhalten höhere zahlen automatisch eine grössere Warscheinlichkeit und das sollte ja wohl nicht sein.

Oder stell dir vor, die erste gezogene Zahl ist schon die höchste aller Möglichkeiten - was dann?

Sollte ich total daneben liegen, grinst einfach und ignoriert mein Posting ;-)


----------



## Gast2 (28. Okt 2010)

Lies vllt mal den Link den ich gepostet hab.


----------



## Landei (28. Okt 2010)

Andi_CH hat gesagt.:


> Ich gebs zu, ich habe nicht jedes Detail nachgelesen, aber wenn die nächste zu ziehende Zahl grösser sein muss als die grösste bisher gezogene Zahl, erhalten höhere zahlen automatisch eine grössere Warscheinlichkeit und das sollte ja wohl nicht sein.
> 
> Oder stell dir vor, die erste gezogene Zahl ist schon die höchste aller Möglichkeiten - was dann?
> 
> Sollte ich total daneben liegen, grinst einfach und ignoriert mein Posting ;-)



Leute, das ist doch wirklich nicht so schwer: Zahl ziehen von 1 bis 49, sagen wir 10. Nächste Zahl ziehen von 1 bis 48, sagen wir 15. Ist sie größer oder gleich als die vorige, um eins erhähen, also 16. Jetzt haben wir 10, 16. Nächste Zahl ziehen von 1 bis 47, sagen wir 15. Größer oder gleich als 10, also um eins erhöhen, mach 16. Größer oder gleich 16, also eins erhöhen, macht 17. Wir haben jetzt 10,16,17. Nächste Zahl ziehen von 1 bis 46, sagen wir 46. Größer als alle drei vorherigen, also dreimal erhöhen, also 49. Damit haben wir 10,16,17,49. Nächste Zahl ziehen von 1 bis 45, sagen wir 4. Ist kleiner als alle, bleibt 4. Damit haben wir 4,10,16,17,49. Nächste Zahl ziehen von 1 bis 44, sagen wir 6. Ist größer als 4 aber kleiner als der Rest, also einmal erhöhen auf 7. Endergebnis 4,7,10,16,17,49. Keine Ahnung wie ich noch erklären soll, dass da alles gleichverteilt ist und nichts doppelt auftritt. Ist eigentlich klar wie Kloßbrühe.


----------



## SlaterB (28. Okt 2010)

Landei hat gesagt.:


> Nächste Zahl ziehen von 1 bis 44, sagen wir 6. Ist größer als 4 aber kleiner als der Rest, also einmal erhöhen auf 7. Endergebnis 4,6,10,16,17,49.


Fehler Fehler Fehler,
Endergebnis 4,7,10,16,17,49


----------



## Landei (28. Okt 2010)

Korrigiert.


----------



## sebi680 (28. Okt 2010)

ARadauer hat gesagt.:


> ja natürlich,
> 
> 
> ```
> ...



Hallo erstmal, bin neu hier 

Hier gibt es ein kleines Problem denke ich.
So wie sich der Thread bisher liest, will der OP einen User 6 Zahlen eingeben lassen und dann vergleichen, ob die Zahlen die gleichen sind, die vorher zufällig ermittelt wurden.

Aber die "equals" Methode aus Arrays überprüft afaik auch die Reihenfolge der Elemente, oder nicht?
D.h. in diesem Fall könnten die gleichen 6 Zahlen in beiden Arrays vorhanden sein, wenn sie aber in einer unterschiedlichen Reihenfolge enthalten sind, kriegt man ein "false".

Habs nicht extra nachgeschaut jetzt, aber ich hab das so in Erinnerung.


----------



## ARadauer (28. Okt 2010)

dann muss man halt vorher sortieren... oder händisch suchen mit zwei verschachtelten schleifen... fals es eine Schulaufgabe ist werd er die Arrays Klasse eh nicht verwenden dürfen...


----------



## sebi680 (28. Okt 2010)

ARadauer hat gesagt.:


> dann muss man halt vorher sortieren... oder händisch suchen mit zwei verschachtelten schleifen... fals es eine Schulaufgabe ist werd er die Arrays Klasse eh nicht verwenden dürfen...




Die Lösungsansätze sind mir klar, ging eher darum, dass der OP nicht einen virtuellen 6er im Lotto erzielt und dann nichtmal ein "Juhu" auf der Kommandozeile angezeigt bekommt 

Und warum sollte er die Arrays Klasse nicht verwenden dürfen?


----------



## ARadauer (28. Okt 2010)

> Und warum sollte er die Arrays Klasse nicht verwenden dürfen?


In den ersten paar vorlesungsübungen ist es sinvoll die Leute die utill, collection klassen nicht benutzen zu lassen.

Klar wenn ich als übung eine verkette Liste machen lassen will und die schreiben new LinkedList();

oder ich will ihnen hash sort , bubble sort beibringen und die machen Collection.sort macht das wenig sinn ;-)


----------

