AGB  ·  Datenschutz  ·  Impressum  







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

Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

Ein Thema von yga · begonnen am 25. Jan 2012 · letzter Beitrag vom 26. Jan 2012
Antwort Antwort
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.344 Beiträge
 
Delphi XE2 Professional
 
#1

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 25. Jan 2012, 20:44
Hallo,

vielleicht solltest noch die Eingabe etwas abfangen.

Falls es TryStrToInt in deinem Delphi schon gibt, könntest folgendes machen:

Delphi-Quellcode:
procedure TForm1.KugelnZiehen(Sender: TObject);
 var s,w,fall,zug:integer;
begin
  If (not TryStrToInt(Weiss.Text, w)) or (not TryStrToInt(Schwarz.Text, s)) then
    begin
      ShowMessage('Eingaben prüfen!'); //oder was auch immer
      exit;
    end;
 
repeat
Somit gibts keine unschöne Exception wenn man keine Zahlen in die Edits eingibt.
Oder man verwendet MaskEdit´s statt Edits.

[Edit]
Klammerfehler beseitigt
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (25. Jan 2012 um 20:48 Uhr)
  Mit Zitat antworten Zitat
yga

Registriert seit: 25. Jan 2012
4 Beiträge
 
#2

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 25. Jan 2012, 21:05
Danke an alle, der Thread kann geschlossen werden, es klappt jetzt alles.
@Helmi: Das ist TryStrToInt ist praktisch, das werd ich auch in Zukunft benutzen, thx.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 25. Jan 2012, 21:07
ok, ich hatte die Schleife übersehen

Ich habe deinen Ursprungs-Quelltext mal etwas modifiziert und entsprechende Kommentare hinzugefügt
Delphi-Quellcode:
procedure TForm1.KugelnZiehen(Sender: TObject);
var s,w,fall,zug:integer;
begin

w:=StrToIntDef( Weiss.text, 0 ); // Wenn keine Zahl im Edit-Feld,
s:=StrToIntDef( Schwarz.text, 0 ); // dann wird der Default-Wert genommen, hier 0
zug := 0; // Initialisierung vergessen, ansonsten hat Zug einen Zufallswert

// Wenn die Summe aus s und w < 1 ist, dann hast du eine Endlosschleife, darum

if ( s + w ) < 1 then
  begin
    ShowMessage( 'Ungültige Eingabe für Schwarz und Weiß!' );
    Exit; // diese procedure wird nun verlassen
  end;

repeat
 begin
  // randomize; // Sollte nur einmal in Anwendung aufrufen werden
  // fall:=(Random(2)+1); {Welcher Fall tritt ein?}
  // Random( 2 ) + 1 ergibt Werte von 1..2 Fall 3 würde also niemals eintreten
  fall := Random( 3 ) + 1; // jetzt gibt es Werte von 1..3 :o)
  Case fall of
   1: begin {Zwei Schwarze Kugeln rausgenommen, eine Schwarze wieder rein}
       if s>=2 then
        begin
        s:=s-1;
        zug:=zug+1;
        end
        // else
      end;
   2: begin {Zwei Weiße Kugeln rausgenommen, eine Schwarze wieder rein}
       if w>=2 then
        begin
        w:=w-2;
        s:=s+1;
        zug:=zug+1;
        end
        // else
      end;
   3: begin {Zwei unterschiedliche Kugeln rausgenommen, eine Schwarze wieder rein}
       if (s>0) and (w>0) then
        begin
        s := s-1;
        zug:=zug+1;
        end
        // else
      end;
 end;
end;
until s+w=1;

  // Textausgabe.Caption:='Züge: '+(inttostr(zug))+' Schwarze Kugeln: '+(inttostr(zug))+' Weiße Kugeln: '+(inttostr(zug))+' ';
  // ist etwas umständlich und du hast immer nur die Variable Zug angegeben, besser so
  // %d ist ein Platzhalter für eine Integer-Zahl
  Textausgabe.Caption := Format( 'Züge: %d Schwarze Kugeln: %d Weiße Kugeln %d', [zug, s, w] );

end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (25. Jan 2012 um 21:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 26. Jan 2012, 04:24
Ich hab da grad noch einen grossen Fehler entdeckt:
fall := Random( 3 ) + 1; // jetzt gibt es Werte von 1..3
Das ist aber aus Sicht der Wahrscheinlichkeit nicht korrekt, denn es gibt 4 Fälle:
1: Schwarz + Schwarz
2: Weiss + Weiss
3: Schwarz + Weiss
4: Weiss + Schwarz
Die Wahrscheinlichkeit zweier Kugeln mit unterschiedlicher Farbe beträgt 50% aller Fälle.
So wie es bisher programmiert wurde wäre die Wahrscheinlichkeit nur 1/3.

Achja, der Kommentar bei dem Fall #2 ist wohl durch Copy & Paste entstanden;
   2: begin {Zwei Weiße Kugeln rausgenommen, eine Schwarze wieder rein}
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 26. Jan 2012, 06:23
Nein, denn die Beschreibung der Aufgabe, der Kommentar und der Code besagen, bei 2 Weißen geht eine Schwarze wieder rein.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
551 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 26. Jan 2012, 06:36
@sx2008. Um der Wahrscheinlichkeit gerecht zu werden müsste man die beiden Kugeln einzeln ziehen. Es sind ja nicht zu jedem Zeitpunkt die gleiche Anzahl Schwarz und Weiße Kugeln vorhanden.


Aber noch eine Frage: Wenn man denn nun den Fall hat->Zwei weiße Kugeln gezogen und vorher noch keine schwarze Kugel gezogen (oder zumindest keine mehr neben dem Topf liegen hat, weil man sie alle wieder reingeworfen hat), wird dann eine neue schwarze Kugel "generiert", oder der Schritt "Eine schwarze wieder in den Topf" übersprungen?


Gruß
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 26. Jan 2012, 06:39
Ganz einfach, die Anzahl der schwarzen Kugeln im Gefäß wird erhöht.

Es ist ein theretisches Konstrukt mit der Annahme, dass die schwarzen Kugeln ausserhalb in beliebiger Anzahl verfügbar sind

EDIT: Der Wahrscheinlichkeit ist mit den 4 Fällen mehr als Genüge getan, es wird durch das separate Ziehen nicht wahrscheinlicher

EDIT2: Wenn ich es mir recht überlege, dann hängt die Wahrscheinlichkeit welche Kombination gezogen wird, ja stark von dem Verhältnis schwarz zu weiß ab - ich glaube jetzt bin ich auch wach.
Somit ist der Lösungsansatz von einbeliebigername eigentlich der sinnvollste
Delphi-Quellcode:
z1 := Random( Schwarze + Weisse ) + 1; // 1. Kugel ziehen
z2 := Random( Schwarze + Weisse - 1 ) + 1; // 2. Kugel ziehen - ist jetzt 1 Kugel weniger im Gefäß

if ( z1 <= Schwarze ) then
  // Erste Kugel ist Schwarz
  begin
    if ( z2 <= Schwarze - 1 ) then
      Fall := 1 // Beide Kugeln Schwarz
    else
      Fall := 3; // Schwarz und Weiß
  end
else
  // Erste Kugel ist Weiß
  begin
    if ( z2 > Schwarze ) then
      Fall := 2 // Beide Kugeln Weiß
    else
      Fall := 3; // Schwarz und Weiß
  end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (26. Jan 2012 um 08:25 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#8

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 26. Jan 2012, 08:23
Der Wahrscheinlichkeit ist mit den 4 Fällen mehr als Genüge getan, es wird durch das separate Ziehen nicht wahrscheinlicher
Das Problem ist hier, die 4 Fälle sind vor jedem Doppelzug unterschiedlich wahrscheinlich.
Im Extremfall sind zum Beispiel nur schwarze Kugeln im Hut.
Man müsste also vor jedem Doppelzug erst einmal die Wahrscheinlichkeit für jede Kombination ermitteln.

Einfacher zu Programmieren ist auf jeden Fall die Variante, jede Kugel einzeln zu ziehen.
Im Prinzip z.B. so:
Delphi-Quellcode:
function Ziehung: Farbe;
begin
  n := Random(AnzahlSchwarz + AnzahlWeiss);
  if n < AnzahlSchwarze then
  begin
    Result := Schwarz;
    Dec(AnzahlSchwarz);
  end
  else
    Kugel1 := Weiss;
    Dec(AnzahlWeiss);
  end;
end;

procedure Doppelzug;
begin
  Kugel1 := Ziehung;
  Kugel2 := Ziehung;

  if Kugel1 = Kugel2 then
    Inc(AnzahlSchwarz)
  else
    Inc(AnzahlWeiss);
end;

Edit: Sehe auch gerade das "einbeliebigername" das Prinzip schon gepostet hat.

Geändert von Blup (26. Jan 2012 um 08:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 26. Jan 2012, 08:27
Es fiel mir - nach dem Kaffee - auch wie Schuppen aus den Haaren
Darum der EDIT in meinem Beitrag
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 17:02 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