# Lotto Programm



## javanoob. (5. Mrz 2009)

Hallo liebe comunity!

Wir sollten ein Lotto programm schreiben, bin auch weit gekommen nur leider kommen die selben Werte raus, obwohl ich versucht habe dies zu verhinden! Habe den Fehler leider nicht finden können!



```
package paket1;
import java.util.*;
import javax.swing.JOptionPane;

public class Klasse1 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Automatisch erstellter Methoden-Stub

int []zahlen = new int[51];
Random zufall = new Random();


for (int i=0;i<50;++i ){
zahlen[i] = i;
}

int e = 50;
int t = 51;

for(int ii=0;ii<7;ii++ ) {
e = e-1;
t--;
zahlen[e] = zufall.nextInt(e);
zahlen[t] = zahlen[e];

}

JOptionPane.showMessageDialog(null, "Die Lottozahlen sind "+zahlen[50]+" "+zahlen[49]+" "+zahlen[48]+" "+zahlen[47]+" "+zahlen[46]+" "+zahlen[45]+" und die Zusatzzahl ist "+zahlen[44],"Lotto",1);







}

}
```

Danke im Vorraus!!


----------



## SlaterB (5. Mrz 2009)

du meinst, dass in deinen 6 Zahlen auch Doppelte enthalten sein können?
schwierig ausgedrückt..

wie möchtest du das denn verhindern? indem du e verringerst?
wenn eine Zufallszahl aus dem Bereich 0-50 ist und die nächste aus 0-49, dann kann es doch zweimal die 42 sein,
so gehts nicht,

du müsstest für jede erstellte Zahl alle bisherigen prüfen und bei Vorhandensein neu würfeln,

oder der einfache Weg:
eine Liste mit 1-49 befüllen und diese dann durchmischen,
vorgegeben per Collection.shuffle(),
alternativ 49x die erste Zahl nehmen, einen zufälligen Index bestimmen und mit dem jeweiligen Element tauschen

Ergebnis der Ziehung ist am Ende die ersten 6 Zahlen der Liste


----------



## DeKa (15. Mrz 2009)

Hey
Also es geht darum 6 verschiedene Zahlen aus 49 zu ziehen? 
Mussten wir im letzten Semeser auch programmieren, hab mein Skript noch hier.. ist relativ simpel. Leider nicht kommentiert aber auf nachfrage erklär ich es gerne.

[highlight=Java]class Main
{

    public static void main(String[] args)
    {
        int[] zahlen = new int[49];

        int n=1;
        for(int i=0; i<zahlen.length; i++)
        {
            zahlen_ = n;
            n++;
        }

        int[] zufallsZahlen = new int[6];
        for(int i=0; i<zufallsZahlen.length; i++)
        {
            int x = (int)(49*Math.random()) + 1;
            for(int j=0; j<zahlen.length; j++)
            {
                if(zahlen[j] == x && x!=0)
                {
                    zufallsZahlen = x;
                    zahlen[j] = 0;
                }
            }


            System.out.print(zufallsZahlen + " ");

        }

    }
}[/highlight]_


----------



## Marco13 (15. Mrz 2009)

Beim ersten Draufschauen würde ich sagen, dass (falls ich nicht gerade unter Koffeinmangel leide) man nicht garantieren kann, dass das Programm terminiert. 

Beim zweiten Draufschauen würde ich sagen, dass das Programm manchmal Arrays liefert, in denen (ggf. sogar mehrmals!) die 0 enthalten ist.

Kurz: Das Programm ist nicht korrekt.

(EDIT: Jetzt, wo der Morgenkaffe in meinem Magen und das dazugehörige Koffein in meinem Gehirn angekommen ist: Doch, es terminiert wohl immer - aber genau das ist die Ursache dafür, dass es falsche Ergebnisse liefert  )


----------



## DeKa (15. Mrz 2009)

hey
danke fürs nachprüfen. Ja du hattest recht.
Hab es nun nochmal neu gemacht un ein paar mal getestet. Also mir fällt jetzt kein Fehler mehr auf.

[highlight=Java]
import java.util.Random;

public class lotto
{
    public static void main(String[] args)
    {
        boolean[] gezogeneZahlen = new boolean[50];
        int[] lottoZahlen = new int[6];

        Random generator = new Random();
        int i=0;

        while(lottoZahlen[lottoZahlen.length-1] == 0)
        {
            int x = generator.nextInt(50);
            if(x==0) continue;

            if(gezogeneZahlen[x]==false)
            {
                lottoZahlen_ = x;
                i+=1;
                gezogeneZahlen[x]=true;
            }
        }

        for(int zahl: lottoZahlen)
            System.out.print(zahl + " ");
    }

}[/highlight]_


----------



## Marco13 (16. Mrz 2009)

Ja - aber JETZT terminiert es nichtmehr unbedingt  D.h. vorher war das Programm nicht korrekt, und jetzt ist es nur _partiell korrekt_ (siehe Korrektheit (Informatik) ? Wikipedia ). 

SlaterB's erste Antwort war schon eine der einfachsten denkbaren Varianten, bei denen man sowohl die partielle als auch die totale Korrektheit leicht beweisen kann, und die SEHR einfach zu Implementieren ist

```
List<Integer> getThem()
{
    List<Integer> list = new ArrayList<Integer>();
    for (int i=1; i<=49; i++) list.add(i);
    Collections.shuffle(list);
    return list.subList(0,6);
}
```
Ist natürlich nicht die effizienteste, aber ... was nützt das effizienteste Programm, wenn es nicht das tut, was es soll....


----------



## SlaterB (16. Mrz 2009)

wobei man aber genausogut sagen kann: partielle Korrektheit? sch.. drauf
sowas hat in einem Anfängerprogramm nix zu suchen, 
und überhaupt, jede Benutzereingabe mit einer Schleife drum bis korrekt eingegeben ist das gleiche,
vielleicht gibt auch niemand was ein..

wenn es um die Entwicklung einer einfachen Lotto-Klasse geht 
und das Schleifen-Verfahren bewußt gegenüber der auch selber zu implentierenden shuffle-Variante gewählt wurde:

Klassen groß schreiben!

edit: sonst wohl ok


----------



## Marco13 (16. Mrz 2009)

Ach SlaterB, du verstehst echt garnichts: Es geht hier ums _Prinzip_   

Mal im Ernst: Wenn hier von "Semestern" die Rede ist, gehe ich schon davon aus, das solche Sachen eine Rolle spielen (sollten). Man wird wohl nie die Möglichkeit haben, zu beweisen, dass ein Benutzer irgendwann die richtige Eingabe macht, aber man sollte beweisen können, dass _wenn_ er eine richtige Eingabe macht, auch die richtige Ausgabe kommt. Zumindest (oder gerade) bei solchen kleinen Übungsporgrammen.


----------

