Verfasst am: 11.01.2022, 10:20
Titel: Lottospiel 6 von 49
Heyho
Ich Versuche gerade ein Lottospiel zu machen, dass solange läuft, bis ich sozusagen eine Millionen gewonnen habe oder ich kein Geld mehr habe z.b. mit 1000 Euro Einsatz.
Weiß gar nicht wo ich anfangen soll ...
Kann mir wer auf die Sprünge helfen?
Danke und liebe Grüße
Für alles weitere müsstest du mehr Details liefern:
- Spielst du immer die gleichen Zahlen?
- Welche Gewinne rechnest du für 3, 4, 5, 6 richtige?
Ansonsten...
Zitat:
Weiß gar nicht wo ich anfangen soll ...
Mit einem ersten Schritt, und dann dem nächsten etc.
Das Beispiel ist jetzt nicht so komplex, dass man sich eine Strategie überlegen muss, was man zuerst wie angeht.
Sollten dir die Grundlagen fehlen, hilft das MATLAB Onramp.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Da das Thema noch gar nicht so alt ist und ich in etwa die gleiche Problemstellung habe, will ich kein neues Thema eröffnen.
Die Problemstellung ist folgene: Programmieren einer Lottosimulation.
Abbruchkriterien sind max Gewinn, max Wochen oder max Einsatz.
In meinem Fall habe ich bereits questdlgs und inputdlgs geschrieben, und versuche mich gerade an dem Vergleich der eiunzelnen Zahlen.
Ich habe kürzlich die "ismember" Funktion entdeckt und stehe momentan auf dem schlauch, da ich keine für mich verständliche Strategie
gefunden habe, das Programm umzusetzen.
Eine ungefähre Grundstruktur habe ich bereits, aber bitte steinigt mich nicht,
wenn ich Anfängerfehler zu lasten der Performance im Code "versteckt" habe.
Grundsätzlich wird zuerst das Abbruchkriterium abgefragt, dadurch dass ich nicht
weiß, wie ich die einzelnen Eingaben verarbeiten soll, habe ich nur switches drin
und versuche nach und nach den rest zu vervollständigen.
Jetzt zu meinen Fragen:
Könnte mir jemand grundsätzlich mal erklären, wie die Ausgaben der einzelnen Cases in Matlab verarbeitet werden?
Wie erreiche ich, dass ein voller "Schein" also 12 Felder mit zufallsgenerierten nicht doppelten Zahlen erstellt wird, die ich im weiteren Verlauf mit der
Lottoziehungszahlen vergleichen kann? (hier habe ich das Problem, dass ich die "gespeicherten" zahlen alle in einem Vektor habe und nicht wie bei dem
Cellarray die 6 Zahlen in einem Vektor pro "Cell"
Gibt es eine schönere Lösung Vektoren aus einem Cellarray zu ziehen und
als Variable zu verarbeiten, als in meinem Code?
Ich danke Euch jetzt schon mal im Voraus für Eure Mühen!!
Code:
% Das ist mein Programm.
%%
clear;clc;format compact
check=1;
passend=1;
Feldpreis=1.20;
Scheinpreis=14.40;
%% Userabfrage
Abbruchkriterium= questdlg('Welches soll das Abbruchkriterium sein?','Abbruchkriterium','Wochen','Einsatz','Gewinn','');
switch Abbruchkriterium
case 'Wochen'
%% Festlegung der Spieldauer, 3 Möglichkeiten
Wochenauswahl= questdlg('Wie viele Wochen soll gespielt werden?','Zeitraum',...
'Eigener Zeitraum','Eine Woche','Vier Wochen',{'[150]'});
switch Wochenauswahl
case 'Eigener Zeitraum'
%Fenster mit Wochenzahleingabe
Anzahlwochen = inputdlg(('Bitte Anzahl der Wochen festlegen'),'Zeitraum wählen',[150],{''});
anz_wochen= Anzahlwochen
anz_wochen=str2num(Anzahlwochen{1});
%Kosten, Ziehungen und Spiele .*anz_wochen case 'Eine Woche'
%Kosten, Ziehungen und Spiele .*1 case 'Vier Wochen'
%Kosten, Ziehungen und Spiele .*4 case ''
errordlg('Abbruch durch User','Fehler');return
end
%% Festlegung Einsatz case 'Einsatz'
max_einsatz=inputdlg('Bitte maximalen Einsatz bestimmen:','Maximaleinsatz',[140],{''});
max_einsatzv=str2num(max_einsatz{1});
case 'Gewinn'
%
case ''
errordlg('Abbruch durch User','Fehler');return
end
%% Festlegung Spielart
Spielart= questdlg('Was möchten Sie spielen?','Spielart','Selbst tippen',...
'Voller Schein','');
switch Spielart
% User tippt eigenständig case 'Selbst tippen'
Zahlwahl= questdlg({'Welche Zahlen?'},'Auswahl der Zahlen', ...
'Gespeicherte Zahlen','Eigene Eingabe',{[150]});
%Dialogfenster mit 2 Knöpfen öffnet sich
switch Zahlwahl
case 'Gespeicherte Zahlen'
disp('Gespeicherte Zahlen')
gespeichert = [5712293641;238153243;38591534;4816194648;...
12527343849;1321253741;61228304249;1712363739;...
2912172834;3630353638;7811323944;41417182436];
case 'Eigene Eingabe'
% Inputfenster für maximal 12 Felder mit Eingabebeispiel
prompt = {'Zahlen bitte durch ein Komma trennen',...
'Feld Nr. 1: ','Feld Nr. 2:','Feld Nr. 3:','Feld Nr. 4',...
'Feld Nr. 5','Feld Nr. 6:','Feld Nr. 7: ','Feld Nr. 8:',...
'Feld Nr. 9:','Feld Nr. 10','Feld Nr. 11','Feld Nr. 12:'};
dlgtitle = 'Eingabe';
dims = [140];
definput = {'Beispiel: x,x,x,x,x,x','','','','','','','','','','','',''};
answer = inputdlg(prompt,dlgtitle,dims,definput,"off");
Zahlentest= answer;
% Weise einzelne Cellarrays den Variablen zu % Eine Funktion wäre schneller, wenn ich wüsste wie % Konvertiere Cellarray 1x6 zu Zeilenvektor
Tipp1= str2num(Zahlentest{2});
Tipp2= str2num(Zahlentest{3});
Tipp3= str2num(Zahlentest{4});
Tipp4= str2num(Zahlentest{5});
Tipp5= str2num(Zahlentest{6});
Tipp6= str2num(Zahlentest{7});
Tipp7= str2num(Zahlentest{8});
Tipp8= str2num(Zahlentest{9});
Tipp9= str2num(Zahlentest{10});
Tipp10= str2num(Zahlentest{11});
Tipp11= str2num(Zahlentest{12});
Tipp12= str2num(Zahlentest{13});
% User bekommt Fehlermeldung, da keine Auswahl getroffen
%Um das Script nach der Fehlermeldung zu unterbrechen, wird hier
%return eingefügt und das Script beendet
case ''
errordlg('Abbruch durch User','Fehler');return
end
%% User tippt vollen Schein case 'Voller Schein'
disp('Voller Schein wird gespielt')
%Voller Schein wird gespielt
case ''
errordlg('Abbruch durch User','Fehler');return
end
%% Ziehung der Lottozahlen incl Sortierung und Überprüfung auf doppelte Zahlen while passend~=0
p=randi([149],[16]);
p=sort(p);
p2=diff(p);
p3=p2==0;
passend=any(p3);
end
gezogen=p;
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
generiert mir 12 Zahlen aus 49, kann ich das ganze umändern, dass mir
6 mal 12 Zahlen generiert werden, ohne for schleife oder das ganze 12 mal zu tippen??
bei cell2mat wirft matlab mir nur fehler aus, da muss ich die doc nochmal studieren.
answer ist doch die Antwort. Was meinst du mit "als argument"??
Zitat:
kann ich das ganze umändern, dass mir
6 mal 12 Zahlen generiert werden, ohne for schleife oder das ganze 12 mal zu tippen?
Was spricht gegen die for-Schleife? Bei dem wenigen Rechenaufwand spielt Performance ja keine Rolle.
Zitat:
bei cell2mat wirft matlab mir nur fehler aus
Wenn du Fehler bekommst und Unterstützung bei der Behebung möchtest:
1. Den verwendeten Code angeben
2. Den erhaltenen Fehler angeben
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
prompt = {'Zahlen bitte durch ein Komma trennen',...
'Feld Nr. 1: ','Feld Nr. 2:','Feld Nr. 3:','Feld Nr. 4',...
'Feld Nr. 5','Feld Nr. 6:','Feld Nr. 7: ','Feld Nr. 8:',...
'Feld Nr. 9:','Feld Nr. 10','Feld Nr. 11','Feld Nr. 12:'};
dlgtitle = 'Eingabe';
dims = [140];
definput = {'Beispiel: x,x,x,x,x,x','1,2,3,4,5,6','2,3,4,5,6,7','3,4,5,6,7,8','','','','','','','','',''};
answer = inputdlg(prompt,dlgtitle,dims,definput,"off");
Zahlentest= answer;
% Weise einzelne Cellarrays den Variablen zu % Eine Funktion wäre schneller, wenn ich wüsste wie % Konvertiere Cellarray 1x6 zu Zeilenvektor cell2mat(Zahlentest)
%[tipp1,tipp2,tipp3,tipp4,tipp5,tipp6,tipp7,tipp8,tipp9,tipp10,tipp11,tipp12]=Zahlentest{2:13}
den unteren Teil hab ich aus der doc. hier wirft der mir allerdings Char arrays raus.
da weiß ich nicht so ganz, wie ich damit umgehen kann, weil ich "row vector" brauche
Edit:
Ja verdammte Axt, ich habe zu viel nebenher gelesen.
mit der 8 als argument sollte als Variable heißen.
Sprich ich möchte die Variable "wochen_anz" definieren um sie im weiteren verlauf mit der Anzahl der "Spiele" bzw "ziehungen" und den "kosten"zu multiplizieren.
sollen wirklich pro Feld 6 Zahlen eingegeben werden?? Das finde ich sehr unübersichtlich.
Wenn du das so möchtest:
nums = str2double(split(Zahlentest,","))
Wenn du das nicht so möchtest, ist mir nicht klar, wie die Eingabe erfolgen soll.
Zitat:
mit der 8 als argument sollte als Variable heißen.
Sprich ich möchte die Variable "wochen_anz" definieren um sie im weiteren verlauf mit der Anzahl der "Spiele" bzw "ziehungen" und den "kosten"zu multiplizieren.
Ich kann nur empfehlen, die Doku der verwendeten Befehle gründlich zu lesen. In der Doku von inputdlg z.B. das Beispiel "Convert Input to Numeric Values".
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
sollen wirklich pro Feld 6 Zahlen eingegeben werden?? Das finde ich sehr unübersichtlich.
Theoretisch könnte ich für jedes Feld, 6 einzelne input zeilen schreiben, das wäre allerdings ziemlich viel getippe. Zumindest aus der Sicht eines Matlabanfängers
gibt es da alternativen zu? For schleife für 12 Felder und jeweils ein inputfeld für jede Zahl?
Zitat:
Wenn du das so möchtest:
nums = str2double(split(Zahlentest,","))
hier gibt es Komplikationen, wenn nicht alle die gleiche Anzahl an trennzeichen haben.
Zitat:
Ich kann nur empfehlen, die Doku der verwendeten Befehle gründlich zu lesen. In der Doku von inputdlg z.B. das Beispiel "Convert Input to Numeric Values".
Danke, da habe ich wohl das ein oder andere entscheidende Wörtchen überlesen...
gibt es da alternativen zu? For schleife für 12 Felder und jeweils ein inputfeld für jede Zahl?
Ich würde eine App erstellen oder Live Controls verwenden.
Zitat:
hier gibt es Komplikationen, wenn nicht alle die gleiche Anzahl an trennzeichen haben.
Stimmt. Was soll aber denn gemacht werden, wenn es unterschiedlich viele Trennzeichen sind? Dann ist das so unübersichtlich, dass es schwierig systematisch und allgemeingültig verarbeitet werden kann.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Ich bin jetzt nochmal ein Stück weiter gekommen und beiße mir gerade die Zähne an einem Vergleich aus.
Wie schaffe ich es eine Zählschleife zu schreiben, die mir die Anzahl der Richtigen tipps mit einem 12x1 Spaltenvektor vergleicht?
Der Versuch im oberen Teil die Zählschleife funktioniert nicht, warum weiß ich leider nicht.
Die Gewinnklassen sind bereits festgelegt und müssen "nur" noch mit den Anzahlen der Richtigen pro tippreihe multipliziert und untereinander addiert werden.
Da stehe ich allerdings auf dem Schlach
Code:
%%
clear;clc;format compact
check=1;
passend=1;
Feldpreis=1.20;
Bearbeitungsgebuehr=0.80;
Scheinpreis=14.40;
GK8=18.50;
GK6=148.10;
GK4=6614.40;
GK2=17074092.80;
rdrei=0;
rvier=0;
rfuenf=0;
rsechs=0;
rzaehler=0;
Kostenvoll=0;
%% Festlegung Spielart
Spielart= questdlg('Was möchten Sie spielen?','Spielart','Selbst tippen',...
'Voller Schein','');
switch Spielart
% User tippt eigenständig case 'Selbst tippen'
Zahlwahl= questdlg({'Welche Zahlen?'},'Auswahl der Zahlen', ...
'Gespeicherte Zahlen','Eigene Eingabe',{[150]});
%Dialogfenster mit 2 Knöpfen öffnet sich
switch Zahlwahl
case 'Gespeicherte Zahlen'
disp('Gespeicherte Zahlen')
gespeichert = [5712293641;238153243;38591534;4816194648;...
12527343849;1321253741;61228304249;1712363739;...
2912172834;3630353638;7811323944;41417182436];
Tippinput=gespeichert
case 'Eigene Eingabe'
prompt = {'Zahlen bitte durch ein Leerzeichen trennen',...
'Feld Nr. 1: ','Feld Nr. 2:','Feld Nr. 3:','Feld Nr. 4',...
'Feld Nr. 5','Feld Nr. 6:','Feld Nr. 7: ','Feld Nr. 8:',...
'Feld Nr. 9:','Feld Nr. 10','Feld Nr. 11','Feld Nr. 12:'};
dlgtitle = 'Eingabe';
dims = [140];
definput = {'Beispiel: x x x x x x','','','','','','','','','','','',''};
answer = inputdlg(prompt,dlgtitle,dims,definput,"off");
Tippinput= answer;
case ''
errordlg('Abbruch durch User','Fehler');return
% User bekommt Fehlermeldung, da keine Auswahl getroffen % Um das Script nach der Fehlermeldung zu unterbrechen, wird hier % return eingefügt und das Script beendet end
%% User tippt vollen Schein case 'Voller Schein'
disp('Voller Schein wird gespielt') % Voller Schein wird gespielt for Tipprandom=1:12
Tippinput(Tipprandom,[1:6])= sort(randperm(49,6));
end
% 12x6dbl für einen Sortierten Schein ohne doppelte Zahlen
case ''
errordlg('Abbruch durch User','Fehler');return
% User bekommt Fehlermeldung, da keine Auswahl getroffen % Um das Script nach der Fehlermeldung zu unterbrechen, wird hier % return eingefügt und das Script beendet end
%% Userabfrage
Abbruchkriterium= questdlg('Welches soll das Abbruchkriterium sein?','Abbruchkriterium','Wochen','Einsatz','Gewinn','');
switch Abbruchkriterium
case 'Wochen'
%% Festlegung der Spieldauer, 3 Möglichkeiten
Wochenauswahl= questdlg('Wie viele Wochen soll gespielt werden?','Zeitraum',...
'Eigener Zeitraum','Eine Woche','Vier Wochen',{''});
switch Wochenauswahl
case 'Eigener Zeitraum'
%Fenster mit Wochenzahleingabe
Anzahlwochen = inputdlg(('Bitte Anzahl der Wochen festlegen'),'Zeitraum wählen',[150],{''});
anz_wochen=str2double(Anzahlwochen{1});
end if rzaehler(:,1)==4
rvier=rvier+1;
end if rzaehler(:,1)==5
rfuenf=rfuenf+1;
end if rzaehler(:,1)==6
rsechs=rsechs+1;
end
Gewinn=(rdrei*GK8)+(rvier*GK6)+(rfuenf*GK4)+(rsechs*GK2);
Gewinn
rzaehler=0 end % Konvertierung Cell in Vektor
%Kosten, Ziehungen und Spiele .*anz_wochen case 'Eine Woche'
for i=1:2% Jeweils 2 Spiele pro Woche
ziehung = sort(randperm(49,6));
richtige= ismember(Tippinput,ziehung(1:6));
rzaehler= sum(richtige);
disp(fprintf('Ziehung %3d -> [%2d %2d %2d %2d %2d %2d] -> %d von 6 richtig\n',i,ziehung(1:6),sum(richtige))) end
%Kosten, Ziehungen und Spiele .*1 case 'Vier Wochen'
for i=1:8% Jeweils 2 Spiele pro Woche
ziehung = sort(randperm(49,6));
richtige = ismember(Tippinput,ziehung(1:6));
rzaehler= sum(richtige);
disp(fprintf('\nZiehung %3d -> [%2d %2d %2d %2d %2d %2d] -> %d von 6 richtig\n',i,ziehung(1:6),sum(richtige))) end
%Kosten, Ziehungen und Spiele .*4 case ''
errordlg('Abbruch durch User','Fehler');return
% User bekommt Fehlermeldung, da keine Auswahl getroffen % Um das Script nach der Fehlermeldung zu unterbrechen, wird hier % return eingefügt und das Script beendet end
%% Festlegung Einsatz
case 'Einsatz'
max_einsatz=inputdlg('Bitte maximalen Einsatz in € bestimmen:','Maximaleinsatz',[140],{''});
max_einsatzv=str2num(max_einsatz{1});
anz_einsatz=(max_einsatzv/15.20);
for i=1:anz_einsatz
Kostenvoll=(Scheinpreis+Bearbeitungsgebuehr)*i;
ziehung = sort(randperm(49,6));
richtige= ismember(Tippinput,ziehung(1:6));
rzaehler= sum(richtige);
disp(fprintf('Ziehung %3d -> [%2d %2d %2d %2d %2d %2d] -> %d von 6 richtig\n',i,ziehung(1:6),sum(richtige)))
% Konvertierung Cell in Vektor % Dient als Quotient für Anzahl der Spiele
%case 'Gewinn'
%
case ''
errordlg('Abbruch durch User','Fehler');return
% User bekommt Fehlermeldung, da keine Auswahl getroffen % Um das Script nach der Fehlermeldung zu unterbrechen, wird hier % return eingefügt und das Script beendet end
rdrei=rdrei+1; % hier hätte ich gerne die Zähler um herauszufinden, wie viele richtige jeweils getippt wurden % allerdings weiß ich nicht ob die schleife hier sinn macht oder in jeden einzelnen case Verbaut werden muss end if rzaehler==4
rvier=rvier+1;
end if rzaehler==5
rfuenf=rfuenf+1;
end if rzaehler==6
rsechs=rsechs+1;
end
Gewinn=(rdrei*GK8)+(rvier*GK6)+(rfuenf*GK4)+(rsechs*GK2);
Gewinn
welchen Teil des recht langen Codes soll man sich nun ansehen?
Mein genereller Rat wäre, im Zweifelsfall erst eine (zukünftige) Iteration der for-Schleife zu implementieren und dann - wenn das funktioniert - die Schleife drumherum zu schreiben.
Hilfreiche Funktionen dürften intersect oder ismember sein.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.