Lottoprogramm

E

Emberghost

Gast
Hallo Community,

Um Java zu lernen habe ich mich mal versucht an eine Aufgabe zu setzen. Es soll ein Lottoprogramm geschrieben werden, wobei man es nach vollgendem Muster machen soll:

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package zufallsgenerator;

/**
 *
 * @author Ember
 */
public class Zufallsgenerator {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        Ziehungsgeraet lotto =
new Ziehungsgeraet({1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49});
for (int k=1; k<=10; k++) // Durchführung von 10 Ziehungen
{
System.out.print("Ziehung " + k + ": gezogene Zahlen:");
Object[] y= lotto.get(6);// Ziehen von 6 Zahlen
for (int i=0; i<y.length; i++)
System.out.print(" " + y[i]);
System.out.println();
lotto.reset(); // Zurücklegen der gezogenen Zahlen
}
        
    }
}

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package zufallsgenerator;

/**
 *
 * @author Ember
 */
public class Ziehungsgeraet {
        protected Object[] v;
        protected String name;


        public Ziehungsgeraet(Object[] x){}
        public Ziehungsgeraet(){Object[] x={};}
        void insert(Object x){}
        public Object get(){return x;}
        public Object[] get(int m){return x;}
        void reset(){}
    
    
}


Nun scheitere ich aber schon daran, den Konstruktor mit dem Feld aus dem Hauptprogramm zu füllen.. Denke nach etwas starthilfe klappt es bestimmt dann.. ist bei mir meistens so.
 

HimBromBeere

Top Contributor
Wenn du schon ein Array übergibst, warum nutzt du es dann nicht? Brauchst doch nur die Instanzvariable v auf das übergebene Array setzen...
Übrigens: Warum nimmst du Object und nicht int?

EDIT:
Java:
public Ziehungsgeraet(){}
public Ziehungsgeraet(int[] numbers){this.v = numbers;}
 
Zuletzt bearbeitet:
E

Emberghost

Gast
Man soll Objekt nehmen, damit man es später auch für andere Sachen, zb Karten anwenden kann.

Ist die Klammersetzung um die Zahlen denn so richtig? Mein Compiler spuckt mir da immernoch fehler aus.

Aufjedenfall mal danke für die schnelle Hilfe.
 
E

Emberghost

Gast
Okay, soweit ist es nun schonmal gut.

Hab gleich nochmal weitere Fragen.

Mit
Java:
int i = (int)(Math.random()*v.length);
kann ich nun die position eines zufälligen Objekts im Feld bestimmen, das weis ich schonmal. Nun würde ich mit
Java:
public Object[] get(int m){
}
gerne m mal hintereinander eine zufällige Position bestimmen, das Objekt das sich an dieser Stelle des Felds befindet "rausziehen" und in ein neues Feld stecken, in dem nachher die 6 gezogenen Zahlen sind. Weis allerdings nicht wie ich etwas "rausziehe" oder "reinstecke" bei einem Feld. Geht das überhaupt so wie ich mir das vorstelle?
 

HimBromBeere

Top Contributor
Klaro... du brauchst doch nur ein neues Array mit der Größe 6.
Java:
Object[] result = new Object[6];
for (int i = 0; i < 6; i++) {
	// berechne zufälligen Index
	int id = Math.random() * v.length;
	// setze Ergebnisfeld 
	result[i] = v[id];
}
return result;
Hab ich zwar nicht getestet, sollte aber gehen

EDIT: Ist m = 6? Frage, weil das hier nicht so eindeutig rüberkommt:
gerne m mal hintereinander eine zufällige Position bestimmen
in dem nachher die 6 gezogenen Zahlen sind
 
Zuletzt bearbeitet:
E

Emberghost

Gast
So klappt es wunderbar und verstehe auch gut was gemacht wird.
Java:
public Object [] get(int m){
        Object[] result = new Object[m];
            for (int i = 0; i < m; i++) {
                int id = (int)(Math.random()*objects.length);
                result[i] = objects[id];
            }
            return result;
Nun habe ich noch ein Problem. Es werden Zahlen doppelt gezogen. Das sollte noch weg. Habe mal v gegen objects getauscht, damit man weis was sich hinter der variablen verbirgt.
 
G

Gast2

Gast
Hab jetzt nicht die ganzen Beiträge gelesen, aber warum legst du int Werte in ein Object[] Array?

Es werden Zahlen doppelt gezogen. Das sollte noch weg.
Erstell dir eine List<Integer> die du mit Zahlen von 1 bis n füllst, die mischst du einmal durch (Collections.shuffle(...)) und nimmst die ersten m Werte der Liste.
 

HimBromBeere

Top Contributor
Oder du musst di noch eine Methode schreiben, die prüft, ob in deinem Array ein bestimmter Wert schon drin ist, aber mittels einer Liste wäre es sicherlich eöegenater und einfacher.
 
E

Emberghost

Gast
@HimBromBeere: Ja genau m ist in dem Fall 6. Ich könnte so aber eben auch durch einfaches Austauschen einer Zahl in der main class auch 10 Zahlen ziehen.

Ich mach das so, weil es hier speziell verlangt ist. Damit man die Klasse auch für andere Dinge statt Zahlen nutzen kann.

@EikeB: Das klingt schon logisch. Würde dennoch gerne wissen, ob es auch die Möglichkeiten gibt, das zuletzt gezogene Element aus dem Feld zu entfernen.
 

HimBromBeere

Top Contributor
Ja genau m ist in dem Fall 6. Ich könnte so aber eben auch durch einfaches Austauschen einer Zahl in der main class auch 10 Zahlen ziehen.
D.h. du müsstest als Grenze der for-Schleife die 6 noch durch ein m ersetzen...
ob es auch die Möglichkeiten gibt, das zuletzt gezogene Element aus dem Feld zu entfernen.
Setze das Element doch dann einfach auf null oder einen Standardwert...
 
G

Gast2

Gast
Ja, du müsstest dann prüfen ob der Wert dein "Streichwert" ist und ne neue Zahl raussuchen.

Würde dennoch gerne wissen, ob es auch die Möglichkeiten gibt, das zuletzt gezogene Element aus dem Feld zu entfernen.
Du kannst nen neues Array erstellen das ein Feld kleiner ist und die Zahlen rüberkopieren. Mit Listen bist du da aber wesentlich besser dran.
 

HimBromBeere

Top Contributor
Klar würde er das... aber 0 ist, wenn ich das richtig sehe, kein Wert, der in einer Ziehung erreicht werden kann, also ein Indikator für: hier lief was falsch.
Daher, auch auf die Gefahr der Widerholung: du musst dir eine Methode schreiben, die prüft, ob im Array ein besttimter Wert schon drin steht. Sollte dem so sein, musst du halt eine neue Zufallszahl erzeugen, solange, bis endlich mal eine gültige Zahl produziert wurde.
 
E

Emberghost

Gast
@EikeB:Hm okay. Wie läuft das genau? Also ich erstelle ein neues Feld, das ein Element kleiner ist als das alte und kopiere alles rüber, außer dem Element dem die ausgeloste id gehört? (Möchte das nur mal eben verstehen.) Und nach den 6 Ziehungen mache ich wieder ein neues Feld und Stecke alles wieder rein? Also möchte auch 10 mal hintereinander 6 Zahlen ziehen können.



@HimBromBeere: Die obere Grenze habe ich durch m ersetzt, müsste in dem obrigen Code auch schon so sein. Ich ziehe momentan jedenfalls richtigerweise 10 mal hintereinander 6 Zahlen. Nur sind es eben nicht immer 6 untereinander Verschiedene.
 

Ähnliche Java Themen

Neue Themen


Oben