Lotto Programm

Status
Nicht offen für weitere Antworten.

javanoob.

Neues Mitglied
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!


Code:
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!!
 
S

SlaterB

Gast
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

Neues Mitglied
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

Top Contributor
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

Neues Mitglied
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

Top Contributor
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
Code:
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.... :rolleyes:
 
S

SlaterB

Gast
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 ;)
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Ach SlaterB, du verstehst echt garnichts: Es geht hier ums Prinzip :cool: :p ;)

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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben