AGB  ·  Datenschutz  ·  Impressum  







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

Zufallszahlen erstellen

Ein Thema von LPIG · begonnen am 7. Nov 2012 · letzter Beitrag vom 14. Nov 2012
Antwort Antwort
Seite 3 von 3     123   
LPIG

Registriert seit: 7. Nov 2012
5 Beiträge
 
#21

AW: Zufallszahlen erstellen

  Alt 11. Nov 2012, 14:38
Hallo,


Die Auswertung war tatsächlich fehlerhaft. Wurde zusammen mit dem Einrücken verbessert.


Hier das verbesserte Programm:

Delphi-Quellcode:
var
  Form1: TForm1;
  x,a,b,c:integer;
  Einsatz : integer;
  Gewinn : integer;
  Zaehler : integer;
  Check:Integer;
  fortschritt:integer;
  i:integer;
  //Tabelle : Array[0..10, 0..20] of integer;
  //Anzahl:Integer;
  //Menge:Integer;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
x:=random(37);
lbzufallszahl.caption := inttostr(x);
//rbGerade.checked := true;
c:=c+1;

if x = 0 then // ##################BANK######################
   begin
   lbAuswertung.caption := 'Die Bank hat gewonnen!';
   i:=Random(2);
   if i = 0 then
   begin
        Gewinn := Gewinn-Einsatz;
   end
   else
   if i = 1 then
    begin
        Gewinn := Gewinn + Einsatz;
     end;

   end
else

if x Mod 2 = 0 then //##################GERADE#####################
begin
  lbAuswertung.caption := 'Es handelt sich um eine GERADE Zahl!';

If rbGerade.checked = true then //Gewonnen
   begin
        Gewinn := Gewinn + Einsatz;
        lbAuswertung.caption := 'Es handelt sich um eine GERADE Zahl! Sie haben '+inttostr(Einsatz)+' Euro gewonnen';
   end;

If rbUngerade.checked = true then //Verlooooren
   begin
         lbAuswertung.caption := 'Es handelt sich um eine GERADE Zahl! Sie haben '+inttostr(Einsatz)+' Euro verloren';
          Gewinn := Gewinn - Einsatz;
   end;
end
else

If x Mod 2 > 0 then // ###################UNGERADE################
begin
     lbAuswertung.Caption := 'Es handelt sich um eine UNGERADE Zahl!';

If rbGerade.checked = true then //Verloooren
   begin
        lbAuswertung.caption := 'Es handelt sich um eine UNGERADE Zahl! Sie haben '+inttostr(Einsatz)+' Euro verloren';
        Gewinn := Gewinn - Einsatz;
   end;

If rbUngerade.checked = true then //Gewonnen
   begin
        lbAuswertung.caption := 'Es handelt sich um eine UNGERADE Zahl! Sie haben '+inttostr(Einsatz)+' Euro gewonnen';
        Gewinn := Gewinn + Einsatz;
   end;
end;
lbGewinn.caption := inttostr(gewinn);
lbVersuche.caption := inttostr(c);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
//Anzahl:=0;
//Menge := 0;
Check:=1;
c:=0;
Einsatz := 2;
Gewinn := 0;
end;

procedure TForm1.edEinsatzChange(Sender: TObject);
begin
If edEinsatz.text = 'then
begin
edEinsatz.text := '2';
end;

Einsatz := strtoint(edEinsatz.text);

end;

procedure TForm1.btComputerClick(Sender: TObject);
var
h : integer;

begin
Fortschritt:=strtoint(edVersuche.text);// Damit die Fortschrittsanzeige funktioniert. Die Zahl brauch ich bestimmmt noch.
for check:=1 to strtoint(edVersuche.text) do
begin
Zaehler := strtoint(edVersuche.text);
rbGerade.checked := true;
a := Gewinn;
Button1Click(Sender);
ProgressBar1.max := Fortschritt;
ProgressBar1.position := check;

If Gewinn < a then // Wir haben verloren
   begin
   Einsatz := Einsatz*2;
   b := 2;
   {Anzahl := Anzahl+1;
  if Anzahl > 4 then
  begin
  Tabelle[Anzahl,Menge] := Anzahl;
   end; }

   end;

If (Gewinn > a) and (b = 2) then //Wir haben gewonnen und davor verloren
   begin
   b:=1;
   Einsatz:=2;
   end;

If Einsatz > 1000 then //Das Limit ist erreicht
   begin
   Einsatz := Einsatz DIV 2 ;
   end;

edEinsatz.text := inttostr(Einsatz);
               if h>=1 then
               begin
                    h:=h-1;
                    btComputerClick(Sender);
               end;
end;
end;


procedure TForm1.btZurueckClick(Sender: TObject);
begin
c:=0;
lbversuche.caption := '';
end;


procedure TForm1.edVersucheChange(Sender: TObject);
          begin
               If edVersuche.text = 'then
          begin
          edVersuche.text := '1';
end;
end;

    procedure TForm1.btBilanzbackClick(Sender: TObject);
    begin
         gewinn:=0;
         lbgewinn.caption:='';
    end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     close;
end;

end.
Falls ihr noch weitere Fehler findet, immer nur her damit. (:
Ansonsten sollte das Programm jetzt ein Roulette Spiel simulieren, indem der Minimaleinsatz bei 2 Euro liegt und der Maximaleinsatz bei 1000, wodurch es möglich ist, den Einsatz 9x zu verdoppeln. Bei einer 0 wird erneut gedreht und die Chance steht 50:50, dass man den Einsatz zurück erhält.

Das bringt mich erneut zu meinem "Unsinn":

Zitat:
Die Wahrscheinlichkeit 1 Spiel zu verlieren beträgt: ca 51% = (19 / 37)
Die Wahrscheinlichkeit 10 Spiele in Folge zu verlieren: 0,001275025...% = (19 / 37) ^ 10
Bei den Bedingungen nach denen wir oben gehen, merkst du glaube ich selbst, wer da Unsinn geschrieben hat. Außerdem habe ich schon mindestens einmal geschrieben, dass ich die Theorie weder verteidigen möchte noch denke, dass es ein Casino gibt, in dem sowas klappen würde. Desweiteren war meine Brechnung als Frage formuliert, weil ich mir wie gesagt nicht sicher war.

Die Wahrscheinlichkeit 1 Spiel zu verlireten beträgt: exakt 50%
Die Wahrscheinlichkeit 9 Spiele zu verlieren beträgt: (1 / 2)^9 = 0,001953125%

(0,998046875 * 2) - (0,001953125% * 1022) = 1,97613281

Falls ich mich nicht irre haben wir also nach den obrigen Bedingungen eine positive Gewinnerwartung. Das es kein Casino gibt, in dem man nach genau den Bedingungen spielen kann, mag stimmen.


Bei 32.000 Durchläufen mit meinem Programm bekomme ich auch eine positive Zahl raus.
Vielen Dank für die vielen Verbesserungen und Anregungen.

lg
LPIG

Edit:
bei 10.000.000 Versuchen bekomme ich -80.000 Euro, irgendwo muss ich was falsch gemacht haben.

Geändert von LPIG (11. Nov 2012 um 19:05 Uhr)
  Mit Zitat antworten Zitat
OmaH

Registriert seit: 14. Nov 2012
1 Beiträge
 
#22

AW: Zufallszahlen erstellen

  Alt 14. Nov 2012, 12:54
Ich möchte doch meinen Senf noch dazugeben. Ihr vergesst nähmlich das Zufall, Wahrscheinlichkeit und Computerprogramme 3 paar Schuhe sind. Ein C.P. kann Wahrscheinlichkeiten aber nie den Zufall brerchnen. Unser biologischer Computer kann mit der Ausage "eine zerdrückte 3" ohne weiteres was anfangen sogar damit rechnen. Ein Computer kann dies nicht. Random: Bei delphi wird der Inhalt einer Speicherstelle im Processor ausgelesen. Davon aus wird zu dem gewünschten Bereich hoch oder zurück gerechnet.Bei Randomitze wird mit der Systemzeit die Speicherstelle ausgesucht. Mit RandomSeed kann das mit der Hand gemacht werden. Dann kommen gleiche Reihen? Zahlen heraus. Probiert mal IF Random(100)< 50 aus Ihr werdet euch wundern. Um ein noch Zufälligeres Ergebnis zu bekommen ruft Random mit der höstmöglichen Integerzahl auf welche das Gerät verarbeiten kann. Dann werden die Rotienen von Delphi nicht benutzt. Bei gerade und ungerade auswertung nähert sich das Ergebnis immer näher an 100% an, erreicht es aber fast nie. Für Spiele empfehle ich, wie bei Spielautomaten einen gesteuerten Zufall zu benutzen. Das ist gerechter.
gruß Helga
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#23

AW: Zufallszahlen erstellen

  Alt 14. Nov 2012, 15:02
Ist es leider.

Ein C.P. [...]kann Wahrscheinlichkeiten aber nie den Zufall brerchnen.
Er kann Zufall simulieren, und genau dafür sind RNGs da, und darum geht's hier ja

Random: Bei delphi wird der Inhalt einer Speicherstelle im Processor ausgelesen.
Nein, es wird der Seed als Startwert für eine Funktion genommen, der eine sog. Reihe bildet. Die Reihenglieder der verwendeten Funktion sind dann statistisch gleichverteilt, und erwecken einen recht guten Eindruck von Zufall. Aber da liest keiner eine "Speicherstelle im Prozessor", was auch immer das sein soll.

Davon aus wird zu dem gewünschten Bereich hoch oder zurück gerechnet.
??

Bei Randomitze wird mit der Systemzeit die Speicherstelle ausgesucht.
Bei Randomize wird der Datums/Zeitwert als Integer gecasted und als Seed genommen.

Dann kommen gleiche Reihen? Zahlen heraus.
Gleicher Seed, gleiche Reihe, ja.

Probiert mal IF Random(100)< 50 aus Ihr werdet euch wundern.
Warum?

Um ein noch Zufälligeres Ergebnis zu bekommen ruft Random mit der höstmöglichen Integerzahl auf welche das Gerät verarbeiten kann. Dann werden die Rotienen von Delphi nicht benutzt.
Jetzt wird's ganz witzig. Hä? NOCH zufälliger? Ich denke ein Computer kann keinen Zufall. Und warum sollte dann nicht die Delphi-Funktion genommen werden?

Bei gerade und ungerade auswertung nähert sich das Ergebnis immer näher an 100% an, erreicht es aber fast nie.
Was zum Henker sind jetzt gerade und ungerade auswertungen? Was nähert sich 100% an, 100% wovon?

Für Spiele empfehle ich, wie bei Spielautomaten einen gesteuerten Zufall zu benutzen. Das ist gerechter.
Und was ist gesteuerter Zufall!?


Selten so viel Komisches Zeug gelesen, tut mir leid. Hier ist leider praktisch alles verkehrt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 21:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz