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
yga

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

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 25. Jan 2012, 20:12
Aah, danke. Vielen Dank für die schnelle Hilfe.
Sorry, Random(x) wurde mir anders erklärt, dass er dort eine zufällige Zahl aus der Menge 0 bis x raussucht. Deswegen auch diese umständliche Beschreibung. Ist gemerkt.
until s+w=1; war so gemeint, dass wenn die Anzahl beider Kugeln im Topf 1 ist, die Schleife enden soll. Muss ich mir nochmal genauer anschauen.

Mir war beim Code noch ein Fehler unterlaufen mit der Ausgabe, bei den inttostr(zug) im Ausgabetext, da sollte natürlich noch inttostr(s bzw. w) stehen. Typischer Copy-Paste-Fehler meinerseits.

Danke, ihr beiden, das hat mich einen großen Schritt nach vorn gebracht.
  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
 
#2

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 25. Jan 2012, 20:15
Random funktioniert genau so, wie man es dir erklärt hat, jedoch solltest du auf die Problematik hingewiesen werden, dass du mit deiner Logik auch dann weiße Kugeln aus dem Topf ziehst, wenn dort eigentlich keine mehr drin sind.

Somit hast du in deiner Logik den Copperfield-Faktor

EDIT: Random( x ) liefert Werte von 0 bis x-1
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
yga

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

AW: Einfache "Kugeln Ziehen"-Aufgabe mit Schleife

  Alt 25. Jan 2012, 20:39
Random funktioniert genau so, wie man es dir erklärt hat, jedoch solltest du auf die Problematik hingewiesen werden, dass du mit deiner Logik auch dann weiße Kugeln aus dem Topf ziehst, wenn dort eigentlich keine mehr drin sind.

Somit hast du in deiner Logik den Copperfield-Faktor
Okay, das verwirrt mich. Ich hab doch bei jedem der drei Fälle mit if abgesichert, dass sich auch mehr als 2 Kugeln der Farbe dort befinden, ansonsten springt er doch sofort zum Ende und "lost" den nächsten Fall aus. Mein einziges Problem besteht nun noch darin, dass wenn Weiß eine ungerade Anzahl hat, sich das Programm aufhängt. Ich weiß bloß nicht, wie das damit zusammenhängt...
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

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

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
 
#5

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
 
#6

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
 
#7

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
 
#8

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
553 Beiträge
 
Delphi 12 Athens
 
#9

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
 
#10

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
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:12 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