# Doppelte Zahlen bei Lotto verhindern



## Vril (3. Feb 2005)

Hallo,
hab ein kleines Lottoprogramm geschrieben. Das Problem dabei ist das auch doppelte Zahlen ausgegeben werden, das bei Lotto aber keinen Sinn macht. Habe versucht das Problem jetzt mit einer if Verzweigung abzufangen und dann einen false werd zurückzugeben. Daraus entstand dann wieder ein neues Problem, und zwar werden dann logischerweise überhaupt keine Zahlen angezeigt.

Hat dazu vielleicht jemand eine Lösung dem Problem zu begegnen?

```
import java.awt.*;
import java.awt.event.*;

public class Lotto_awt extends Frame implements ActionListener {
	Button zahl;
	double zahlkomma;
	boolean gedrueckt = false;
	int zahl1, zahl2, zahl3, zahl4, zahl5, zahl6;
	
	public Lotto_awt (String title) {
		super (title);
		setSize(400,200);
		setLayout(new FlowLayout());
		
		Button zahl = new Button("Nächste Zahl");
		add(zahl);
		zahl.addActionListener(this);
		setVisible(true);
	}
	public void actionPerformed(ActionEvent event) {
		gedrueckt = true;
		zahl1 = (int)(Math.random()*49)+1;
		zahl2 = (int)(Math.random()*49)+1;
		zahl3 = (int)(Math.random()*49)+1;
		zahl4 = (int)(Math.random()*49)+1;
		zahl5 = (int)(Math.random()*49)+1;
		zahl6 = (int)(Math.random()*49)+1;
		if (zahl1==zahl2||zahl1==zahl3||zahl1==zahl4||zahl1==zahl5||zahl1==zahl6||
		    zahl2==zahl3||zahl2==zahl4||zahl2==zahl5||zahl2==zahl6||
		    zahl3==zahl4||zahl3==zahl5||zahl3==zahl6||
		    zahl4==zahl5||zahl4==zahl6||
		    zahl5==zahl6){
		gedrueckt = false;
		
		}
		
		repaint();
	}

	public void paint(Graphics g) {
		if(gedrueckt){
			g.drawString("Die Lottozahle, 6 aus 49",50,100);
			g.drawString(""+zahl1+", "+ zahl2+", " + zahl3+", "
			               +zahl4+", "+ zahl5+", " + zahl6,50,125);
			
		}
	}	
	public static void main (String[] args){
		new Lotto_awt ("Lottozahlen berechnen");
	}
}
```


----------



## bambi (3. Feb 2005)

Hab' jetzt gerade nicht sooo die Zeit, aber ich wuerde mir vielleicht einfach alle gezogenen Zahlen in ein array schreiben und dann bei jeder neuen Zahl vergleichen, ob sie schon drin steht. Wenn nicht - okay; wenn doch - neu suchen.

Gibt bestimmt auch noch einige bessere Loesungen - mal ein Anfang... Dir faellt sicher noch was besseres ein.


----------



## bygones (3. Feb 2005)

speichere die Zahlen in einer Collection (Vector, ArrayList) oder wie schon gesagt in einem Array und überprüfe für jede Zahl ob sie schon gezogen worden ist (vorhanden in Collection, Array). wenn nicht hinzufügen und ausgeben

BTW: Was hat deine Frage mit dem Titel zu tun ????????


----------



## mic_checker (3. Feb 2005)

Oder du könntest mit Mengen arbeiten, die add Methode bei HashSet gibt ja false zurück false das Element welches du versuchst hinzuzufügen schon in der Menge enthalten ist.


----------



## dotlens (3. Feb 2005)

*titel anpass*


----------



## Karl (3. Feb 2005)

Hallo,

für dieses Problem ist es am einfachsten, die n=49 Zahlen vorher in ein Array zu packen.
Dann wird zufällig ein Array-Platz m bestimmt und die Zahl "gezogen". 

int m = myRandom.nextInt(n);
int val = arr[m];

Nach der Ziehung wird die gezogene Zahl "nach hinten getauscht" und der Suchraum um eins verkleinert. 
arr[m] = arr[n-1];
arr[n-1] = val;
n--;

Die bereits gezogene Zahl ist nun außerhalb des Suchraums, es kann die nächste Zahl gezogen werden, usw.

So kommst Du ohne Prüfung aus, ob eine Zahl bereits gezogen wurde, denn die gezogenen fliegen
automatisch aus dem Suchraum.

Gruß,

Karl


----------



## mic_checker (3. Feb 2005)

Hab hier mal die Lösung zu obigem Ansatz (mit HashSet):


```
import java.util.*;

public class Lotto1
{
	public static void main(String[] args)
	{
		int zahl,count = 0;
		HashSet lotto = new HashSet();		
		Random gen = new Random();
		
		/* Es sollen 6 Zahlen gezogen werden */
		while(count < 6)
		{
			/* 0 ist nicht erwünscht */
			do
			{
				zahl = gen.nextInt(50);
			}while(zahl == 0);
			
			if(!lotto.add(new Integer(zahl)))
				continue;
			
			System.out.println(++count+".Zahl = "+zahl);			
		}
			
	}
}
```

Ich hoffe es ist ok, wenn mal ganzer Code gepostet wird, normalerweise würde ich ja Teil-Code weglassen damit der andere noch überlegen muss was einzufügen ist, allerdings ist das bei dem Beispiel recht schwer....

müsste so aber eigentlich klappen


----------



## Karl (3. Feb 2005)

Hallo,

stimmt, funktioniert so.

Ich habe mal spaßeshalber die oben geschilderte Variante probiert und (beide Varianten ohne System.out) gemessen:

```
private static final int[] ZAHLEN = new int[49];
    static {
        for (int i = 0; i < 49; i++) {
            ZAHLEN[i] = i+1;
        }
    }
    
    private static final Random rand = new Random();    

    public static void doVariante2() {
        int searchMax = 49;
        int val = 0;
        for (int i = 0; i < 6; i++) {
            int pos = rand.nextInt(searchMax);
            val = ZAHLEN[pos];
            ZAHLEN[pos] = ZAHLEN[searchMax-1];
            ZAHLEN[searchMax-1] = val;
            searchMax--;
            //System.out.println((i+1) + ".Zahl = " + val);
        }
    }
```


Letztere ist etwas schneller, aber das spielt für's Lottozahlen-Ziehen erst eine Rolle, wenn Du Millionen von Ziehungen machst    .

Gruß,

Karl


----------



## Vril (3. Feb 2005)

Danke, so funktionier es!
Aber wie geht es, das ich in GUI alle Zahlen in einem Frame ausgebe.
Übers DOS Fenster mach ich es ja so:
//System.out.println((i+1) + ".Zahl = " + val); 

Aber in GUI zeigt er ja bei z.B. g.drawString(""+i+", ", 50,50); immer nur eine Zahl an!

Hat dazu jemand zufällig eine Lösung?


----------



## Wildcard (3. Feb 2005)

Die letzten beiden Paramter von drawString geben die Position an.
Wenn du die veränderst kannst du auch mehr als einen String in den Frame zeichnen.


----------



## Vril (4. Feb 2005)

@Wildcard
Also das mit der Positionierung hinsichtlich g.drawString("  ", x, y) bzgl. x und y Koordinate ist mir schon klar.
Aber in diesem Fall besteht ja i aus mehreren Zahlen, den Lottozahlen, bei einer verwednung von i in einem g.drawString wird ja nur eine Zahl angezeigt und die anderen darübergeschrieben, so dass man nichts mehr erkennen kann!

Ich hab auch schon folgendes versucht:
g.drawString("Zahl 1 "+i, 50,50);
g.drawString("Zahl 2 "+i, 50,100);

aber auch in diesem Fall wird immer nur eine Zahl angezeigt und die restlichen darüber geschrieben!

Gibt es dafür eine Lösung?


----------



## bygones (4. Feb 2005)

ich würde eher mit Componenten wie (J)Label, (J)TextField arbeiten, anstatt das ganze zu zeichnen....


----------

