AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Roulette-Strategie-Simulator

Offene Frage von "Der Siedler"
Ein Thema von Der Siedler · begonnen am 1. Jul 2013 · letzter Beitrag vom 3. Jul 2013
Antwort Antwort
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#1

AW: Roulette-Strategie-Simulator

  Alt 1. Jul 2013, 09:38
Delphi-Quellcode:
procedure TfMasseEgale.Stueckgewinn;
begin
  if i < strtoint(edAnzahl.Text)
    then
    begin
      while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do
      begin
        Wurf('Keine Wette');
      end;
      if aManque - aPasse = 5
        then Passespiel
        else Manquespiel;
      Stueckgewinn;
    end;
  lbGewinn.Caption := floattostr(aGewinn) + ' Gewinn, Rückhalt: ' + floattostr(-aMinus);
  edAnzahl.Text := inttostr(i);
end;
Ruft sich selber auf, dadurch kommt das Programm in eine Endlosschleife.
Solltest also die Werte im Auge behalten...

Edit:
Wenn das:

      while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do nicht erfüllt wird, hängt er hier in einer Endlosschleife.
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)

Geändert von lbccaleb ( 1. Jul 2013 um 09:44 Uhr)
  Mit Zitat antworten Zitat
Der Siedler

Registriert seit: 1. Jul 2013
9 Beiträge
 
#2

AW: Roulette-Strategie-Simulator

  Alt 1. Jul 2013, 09:42
@lbccaleb: Auch das ist gewollt. Da dieser Selbstaufruf aber nur stattfindet, wenn i die Grenze noch nicht überschreitet, kann das nicht die Ursache des Fehlers sein. Der tritt schließlich auch dann auf, wenn als Grenze 1 eingegeben wird.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Roulette-Strategie-Simulator

  Alt 1. Jul 2013, 09:47
Also siehe mein Edit:

Wenn das nicht zutrifft:

while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do


also aManque - aPasse und aPasse - aManque größer als 5 sind, wird i nicht mehr abgearbeitet und die Funktion ruft sich immer wieder selbst auf.
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Der Siedler

Registriert seit: 1. Jul 2013
9 Beiträge
 
#4

AW: Roulette-Strategie-Simulator

  Alt 1. Jul 2013, 09:55
Wenn die Bedingung nicht eintritt, ruft die Prozedur "Stueckgewinn" immer wieder "Wurf" auf, nicht sich selbst. Und das sollte doch kein Problem sein, auch, wenn das von mir aus 100.000 Mal passieren muss, bis die Bedingung eintritt. Mein Problem ist, dass ich genau die Zahl haben will, nachdem der gesuchte Fall endlich eintritt, um einen Überblick zu bekommen. Wenn das Programm aber bei den wirklich großen Zahlen abbricht, nützt mir das de facto gar nichts. Dass es viele Fälle gibt, wo das recht zeitnah eintritt, ist mir klar, aber ich will eben auch die Fälle erfassen, wo es eine halbe Ewigkeit oder länger dauert.

@DeddyH: Danke! Werde ich mir mal ansehen und ausprobieren.
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Roulette-Strategie-Simulator

  Alt 1. Jul 2013, 10:10
Noch 2 kleine Tipps:

1. Schreibe im btStartClick vor Stueckgewinn ein Screen.Cursor := crHourGlass und nach Stueckgewinn ein Screen.Cursor := crDefault. Dadurch hast du eine Sanduhr während er läuft.

2. Schreibe am Ende innerhalb aller while-Schleifen ein Application.ProcessMessages. Dadurch legst du nicht alles lahm und der "weisse Bildschirm" ist damit auch nimmer.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Roulette-Strategie-Simulator

  Alt 1. Jul 2013, 10:24
Delphi-Quellcode:
procedure TfMasseEgale.Stueckgewinn;
begin
  if i < strtoint(edAnzahl.Text) then begin
    while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do begin
      Wurf('Keine Wette');
    end;

    if aManque - aPasse = 5 then Passespiel
    else Manquespiel;
    
    Stueckgewinn;

  end;
  lbGewinn.Caption := floattostr(aGewinn) + ' Gewinn, Rückhalt: ' + floattostr(-aMinus);
  edAnzahl.Text := inttostr(i);
end;
Wenn das kein Selbstaufruf ist...
Und wo kommt deses i her. Ich finde die Verdammung der globalen Variablen oft zu ideologisch, in diesem Fall kann ich nur sagen "recht so". Zumindestens beim debuggen sind sie alles andere als hilfreich.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Der Siedler

Registriert seit: 1. Jul 2013
9 Beiträge
 
#7

AW: Roulette-Strategie-Simulator

  Alt 1. Jul 2013, 11:59
@p80286: Bei allem Respekt, ich glaube nicht, dass das Problem in diesem Programm am Selbstaufruf von "Stueckgewinn" liegt. Wenn man sich das ganze mal näher ansieht, wird man merken, dass der Fehler da nicht liegen kann. Der Aufruf passiert ja nur, wenn i unter der festgelegten Grenze liegt, und die habe ich in meinen Testläufen bisher immer auf 1 gesetzt. Trotzdem tritt der Fehler auf, obwohl der Selbstaufruf de facto nicht mehr auftreten kann! Das kann man also vorerst übergehen.

@baumina: Danke
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#8

AW: Roulette-Strategie-Simulator

  Alt 3. Jul 2013, 00:28
Hallo,

vielleicht verstehe ich da etwas falsch. Wenn Du Deine Anwendung startest, dann zählt Dir zunächst
Delphi-Quellcode:
  while ((aManque - aPasse) < 5) and ((aPasse - aManque) < 5) do
    Wurf('Keine Wette');
aManque und aPasse solange hoch, bis die Differenz kleiner als fünf ist (aGewinn und aMinus verändern sich nicht). Dies wird u. U. auch irgendwann (bevor es zu einem Rangeoverflow kommt) erreicht.
Danach rufst Du Passespiel (oder Manquespiel egal) auf. Du startest mit
Delphi-Quellcode:
aGewinn := 0;
aGewinnziel := 1;
Wurf ('Passe'); // (für Random() in {1..18}) => aGewinn = -1 (die Bedingung der while Schleife ist weiterhin erfüllt) also
Wurf ('Passe'); // (für Random() in {19..36}) => aGewinn = 0 (die Bedingung der while Schleife ist weiterhin erfüllt) also
Wurf ('Passe'); // (für Random() in {1..18}) => aGewinn = -1 usw. und Deine Anwendung läuft in ggf. in eine schöne Endlosschleife
Natürlich kann es nun sein, dass aGewinn - im ungünstigen Fall - immer weiter Richtung minus Unendlich wandert, aber auch ein kleiner Eins reicht bereits aus, um weiterhin die Schleifenbedingung zu erfüllen (Endlosschleife). Deshalb erweitere ich die Forderung, nicht nur eine untere Schranke für den Verlust (mein Hinweis auf aMinus) einzuführen, sondern auch eine maximale Obergrenze für die Anzahl für die Versuche der Passe bzw. Manque Spiele zu definieren. Ersteres zum Schutz des Spielers (bevor noch Haus und Hof draufgeht); zum zweiten: Die Angestellten der Spielbank möchten auch mal Feierabend haben.

[EDIT]
BTW: Ich wäre als Spieler schon mächtig angefressen, wenn der Croupier mir bei einem Passespiel zunächst von meinem Gewinn meinen Spieleinsatz abknöpft, um mir anschließend - vielleicht mit breitem Grinsen - meinen Einsatz als Gewinn zuschiebt und auch als solchen verkaufen möchte (mit anderen Worten: Schau Dir nochmal Deine Wurf-Methode und meine Anmerkungen dazu an).
[/EDIT]

Zitat:
Das Problem dabei ist, dass dafür nicht eine bestimmte Schranke von aMinus unterschritten werden muss. Es kann sich auch konstant bei 10 Abweichung einpendeln und nie auf 4 fallen. Somit würde das ganze auch gefühlt ewig laufen, obwohl aMinus gar nicht sonderlich unüberschaubar wird.
Sorry, damit kann ich nun gar nix anfangen.

Gruß
Volker Zeller

Geändert von Volker Z. ( 3. Jul 2013 um 01:04 Uhr)
  Mit Zitat antworten Zitat
Der Siedler

Registriert seit: 1. Jul 2013
9 Beiträge
 
#9

AW: Roulette-Strategie-Simulator

  Alt 3. Jul 2013, 21:54
Zu Absatz 1, wahrscheinlich bloß ein Tippfehler deinerseits: Ich zähle nicht hoch, bis die Differenz kleiner, sondern bis sie bei 5 ist. Kleiner ist sie ja immer von Anfang an.

Zu Absatz 2: Die Anzahl der Manque-/Passespiele ist quasi limitiert, wenn ich in edAnzahl 1 eingebe. Dann wird in den allermeisten Fällen ein Passe-/Manquespiel ausreichen, um das benötigte Stück zu gewinnen.

Zum Edit: Naja, das ist vllt nicht authentisch umgesetzt, aber es passiert doch genau das, was passieren sollte? Für mich kommt es ja nun wirklich auf dasselbe raus, an der Prozedur Wurf werde ich deshalb nun nicht mehr rumbasteln. Wenn es dich aber glücklich macht, dann hast du dir das wahrscheinlich so vorgestellt

Code:
procedure TfMasseEgale.Wurf (pWette : string);
begin
  a := Random(37);
  case a of
    0 : begin
               aZero := aZero + 1;
               if pWette <> 'Keine Wette'
                 then aGewinn := aGewinn - 0.5;
             end;
    1..18 : begin
               aManque := aManque + 1;
               if pWette = 'Manque'
                 then aGewinn := aGewinn + 1
               else
                 if pWette = 'Passe'
                   then aGewinn := aGewinn - 1
             end;
    19..36 : begin
               aPasse := aPasse + 1;
               if pWette = 'Passe'
                 then aGewinn := aGewinn + 1
               else
                 if pWette = 'Manque'
                   then aGewinn := aGewinn - 1
             end;
  end;
  i := i + 1;
  if aGewinn < aMinus
    then aMinus := aGewinn;
end;
Und all die Grenzen, die ich einführen könnte, würden letztendlich mein Vorhaben ad absurdum führen, denn gerade diese extremen Fälle will ich ja aufzeichnen und statistisch auswerten. Wenn ich da immer aufhöre, bevor es spannend wird, dann kann ich mir genau diese Auswertung auch sparen.

Vielen Dank für die Mühen,

Der Siedler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz