# Lottozahlen



## mlauX (7. Jun 2010)

Hallo,

ich soll die Lottoziehung simulieren. Zufallszahlen erstellen und in eine Liste schreiben kann ich. Allerdings funktioniert es irgendwie nicht, dass ich die Liste auch ausgebe. Ich komme einfach nicht weiter, da entweder die Adresse der jeweiligen Zahl geliefert wird oder immer die zuletzt hinzugekommene Zahl (wegen static). Ich hab irgendwo ein Denkfehler und weiß nicht wo. 

Deshalb wend ich mich jetzt an Euch. Hier ist mein Javacode:

```
import java.util.*;

public class Lotto {
	static int zahl; 
	
	public static void main(String[] args) {
		LinkedList<Lotto> zahlen = new LinkedList<Lotto>();

		Lotto zahl1 = new Lotto((int)(Math.random()*((49-1) + 1))+1);
		zahlen.add(zahl1);
		System.out.println("LottoList ist " + zahlen.size());

		Lotto zahl2 = new Lotto((int)(Math.random()*((49-1) + 1))+1);
		zahlen.add(zahl2);
		System.out.println("LottoList ist " + zahlen.size());

		Lotto zahl3 = new Lotto((int)(Math.random()*((49-1) + 1))+1);
		zahlen.add(zahl3);
		System.out.println("LottoList ist " + zahlen.size());
		
		Lotto zahl4 = new Lotto((int)(Math.random()*((49-1) + 1))+1);
		zahlen.add(zahl4);
		System.out.println("LottoList ist " + zahlen.size());
		
		Lotto zahl5 = new Lotto((int)(Math.random()*((49-1) + 1))+1);
		zahlen.add(zahl5);
		System.out.println("LottoList ist " + zahlen.size());
		
		Lotto zahl6 = new Lotto((int)(Math.random()*((49-1) + 1))+1);
		zahlen.add(zahl6);
		System.out.println("LottoList ist " + zahlen.size());

                for( int i = 0; i < zahlen.size(); i++ ){
			System.out.println(zahl);
		}
		
	}
	
	
	public Lotto() {}
	
	public Lotto(int zahl) {
		this.zahl = zahl;
		System.out.println("Es wurde eine Zahl erstellt.. " + zahl);
	}
	
	public int getZahl() {
		return this.zahl;
	}
	
	public void setZahl(int zahl) {
		this.zahl = zahl;
	}
		
}
```

Ich weiß, dass die for-Schleife nicht einfach so in der Main stehen sollte.. Aber alle anderen Lösungen funktionieren "noch weniger"..

Ich danke schonmal für Tipps und Tricks


----------



## eRaaaa (7. Jun 2010)

zu deinem Problem:

entweder getter-Methode bereitstellen in der Klasse Lotto und dann z.B. /edit: boah was ist denn heute los, du hast ja schon getter *an Kopf fass!

```
for( int i = 0; i < zahlen.size(); i++ ){
            System.out.println(zahlen.get(i).getZahl()); //oder for-each !
 }
```

oder aber du überschreibst die toString-Method aus Object, dann siehste auch keine Adresse mehr ^^

p.s.:


> Zufallszahlen erstellen und in eine Liste schreiben kann ich



joah, aber in Lottoziehungne (zumindest hier in D) gibt es keine Duplikate :bae:


----------



## Final_Striker (7. Jun 2010)

Vllt solltest du noch überlegen wie du die Ziehung mit Hilfe einer Schleife lösen kannst. So wie du es gemacht hast ist es ziemlich unschön. Wenn du anstatt 6 Zahlen 100 ziehen musst, schreibst du es ja auch nicht 100 mal hin. ;-)


----------



## mlauX (7. Jun 2010)

Die Duplikate werde ich mir dann später vornehmen, erstmal sollte das so funktionieren  Genauso wie die Schleife, damit ich nicht falls ich mal mehr Zahlen erstellen will, zig mal copy&paste machen muss..

Allerdings funktioniert es mit dem Getter auch nicht. Immer die zuletzt erstellte Zahl kommt als Ergebnis..


----------



## eRaaaa (7. Jun 2010)

Ja, Zeile 5 das static muss natürlich raus !


----------



## mlauX (7. Jun 2010)

eRaaaa hat gesagt.:


> Ja, Zeile 5 das static muss natürlich raus !



Ups, danke


----------



## mlauX (7. Jun 2010)

Eine kurze Frage noch..

Kann ich die Einträge der Liste mit der neu erstellten Zahl vergleichen? Wenn ja, wie? 

PS.: Die Schleife funktioniert jetzt auch, ich brauche also nur noch diese Feinheit.


----------



## eRaaaa (7. Jun 2010)

Es gibt verschiedene Möglichkeiten!


> Kann ich die Einträge der Liste mit der neu erstellten Zahl vergleichen? Wenn ja, wie?


ginge mit contains, allerdings müsstest du dafür equals überschrieben haben!
(oder selbst drüber iterieren und prüfen..)

Eine generell andere Möglichkeit wäre, du füllst eine andere Liste mit allen möglichen Zahlen(also eine Liste mit 1-49).
Generierst dann eine Zufallszahl von 0..list.size-1 und löschst danach diese Zahl einfach.

grob:

```
List<Integer> all = new LinkedList<Integer>();
    	for (int i = 1; i < 50; i++) {
			all.add(i);
		}
    	Random r = new Random();
    	
        LinkedList<Lotto> zahlen = new LinkedList<Lotto>();
        Lotto zahl1 = new Lotto(all.remove(r.nextInt(all.size())));
        zahlen.add(zahl1);
```

(ansonsten gäbe es noch Collections.shuffle und so Scherze- siehe Forensuche )


----------



## lordstege (7. Jun 2010)

Wir hatten in der Uni mal ne ähnliche Aufgabenstellung.

Ich hab dafür einfach n TreeSet verwendet. Das hat 2 Vorteile: 
- zum einen sind keine doppelten Werte erlaubt, d. h. wenn du ne Zahl hinzufügst, die bereits im Set vorhanden ist, passiert nichts
- zum anderen werden die Werte automatisch beim Hinzufügen sortiert

Wenn es also nich darum geht Sortierung etc. selbst zu implementieren, wirfst du mit ner schleife einfach so lange neue Werte in dein Set bis die Größe 6 beträgt. N einfacher 2-Zeiler also ... ;-)

Für die, die es interessiert:
Unser Informatik-Prof hatte damals seine Zweifel daran, dass die Wahrscheinlichkeit nicht die gleiche ist, wie bei ner "normalen" Lotto-Ziehung.
Ein Mathe- und ein Statistik-Prof haben das dann aber mal durchgerechnet, und mir bestätigt, dass die Wahrscheinlichkeit genau die gleiche ist.


----------



## mlauX (7. Jun 2010)

Ist die Genauigkeit nur beim TreeSet die Gleiche? Oder auch bei bei den Zufallszahlen aus der Liste?

Achja, danke an alle.. Ich habs fertig bekommen!


----------



## lordstege (7. Jun 2010)

Also eRaaaa's Variante ist im Hinblick auf die Wahrscheinlichkeit korrekt.
Denn eine Zahl die "gezogen" wurde, wird ja aus der Liste der Möglichen direkt entfernt, kann also nicht noch einmal gezogen werden. Ist also genau das gleiche wie die Lotto-Ziehung im Fernsehen.

Gruß Stefan


----------

