Autor Beitrag
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 21.02.10 23:23 
Hallo,

so ein kleines Programm und 10 Mb im Speicher wenn es laeuft.
Aber es funktiniert wohl wie die Version von bole und kommt auf etwa 27,96.
Das Label flackert enorm und wird zeitweise nicht mehr dargestellt., weniger Aktualisierungen sind augenfreundlicher ;-)

Gruß Horst
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: Mo 22.02.10 02:09 
OK, meine 26,9 waren falsch :(
Der Fehler lag nicht in meinem Algo, sondern bei dem angegebenen Fisher-Yates-Shuffle.
Ich hatte ein Array von 1..32, der angegebene Quelltext funktioniert nur bei Arrays, die bei 0 beginnen.
So hatte ich am Ende immer noch das Masimum (32) stehen, so dass mein Wert um ca. 1 größer war.

Ich glaube, der Quelltext müsste so aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
// perfektes Mischen nach Fisher-Yates (angelehnt an einen Vorschlag von alzaimar)
procedure ShuffleFisherYates(var aArray: TArray);
  var
    i,j: Integer;
    tmp: TArrayElement;
begin
  // alle Elemente des Feldes durchlaufen
  for i := Low(aArray) to High(aArray) do begin
    // neue, zufällig Position bestimmen
    j := i +Random(Length(aArray) -i +Low(aArray));
    // Element Nr. i mit Nr. j vertauschen (3ecks-Tausch)
    tmp := aArray[j];
    aArray[j] := aArray[i];
    aArray[i] := tmp;
  end;
end;

ub60
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mo 22.02.10 02:20 
Hallo,

Dann ist ja wieder alles im Lot :-)

Ich komme so auch auf 27.941...
Ist etwas seltsam gemischt, weil ich nicht immer komplett neu mische, sondern die alte Mischung als Ausgangpunkt nehme.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
{$Apptype console}
uses
  sysutils;
const
  Runden = 100000000;// 1e8
var
  T1,T0: TDateTime;
  Karten : array[0..31of integer;
  i,j,tp,MaxBisher,AnzRechts,cnt: integer;

procedure swap(i,j:integer);
var
  tmp : integer;
begin
  tmp:= Karten[i];
  Karten[i]:=Karten[j];
  Karten[j]:=tmp;
end;

begin
  T0 := time;
  randomize;
  For i := 0 to 31 do
    Karten[i] := i;
  AnzRechts:= 0;
  cnt := 0;
  For j := 1 to Runden do
    begin
    i := 31;
    tp := random(i+1);
    swap(tp,i);
    inc(cnt);
    inc(AnzRechts);
    MaxBisher := Karten[i];
    while MaxBisher <> 31 do
      begin
      inc(cnt);
      tp := random(i+1);
      swap(tp,i);
      IF  MaxBisher< Karten[i] then
        begin
        MaxBisher:= Karten[i];
        inc(AnzRechts);
        end;
      dec(i);
      end;
    end;
  T1 := time;
  writeln('Karten rechts     ',AnzRechts/Runden:10:7);
  writeln('Karten links      ',32-AnzRechts/Runden:10:7);
  writeln('Karten bis 32 kam ', cnt/Runden:10:7);
  writeln;
  writeln('Zeitdauer ',FormatdateTime('hh:mm:ss.zzz',T1-T0));
  readln;
end.
{
Karten rechts      4.0586284
Karten links      27.9413716
Karten bis 32 kam 16.9848054 // Sollte das nicht 16 sein? 

Zeitdauer 00:00:20.500}


Aber eigentlich wollte ich ja zählen.
1,2,3,4,...31,32 links 0 rechts 32 0! fach
1,2,3,4,...32,31 links 1 rechts 31 1! fach
1,2,3,4,..32,30,31 links 3 rechts 30 aber 2! fach

Aber jetzt muss ich natürlich die Zahlen vor der 32 permutieren und deren Anordnung testen
1,2,3,4,...29,30,31 links 0 rechts 31 war schon bei der ersten von 32 dabei
__1,2,3,4,.29,31,30 links 1+0 rechts 30 + 1 weil die 32 noch folgt die Werte für links und rechts mitnehmen
__1,2,3,4,.31,29,30 links 2+0 rechts 30 + 1 wieder 2! fach
..
Und das selbe Spiel mit 1,2,3..30 , eben den Karten die dann vor der 31 stehen.

Nun gut.Ich brauche wohl ein Feld was mir links X rechts 32-X zaehlt.
Ich permutiere ja nicht wirklich, ich zaehle nur , die Anzahl wenn ich die höchste Zahl noch vorne blubbern lasse.
Aber es gibt sehr viele Wiederholungen :( , vielleicht kann die auch vorab zählen..

Gruß Horst
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.02.10 03:11 
Moin!

user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Der Fehler lag nicht in meinem Algo, sondern bei dem angegebenen Fisher-Yates-Shuffle.
Ich hatte ein Array von 1..32, der angegebene Quelltext funktioniert nur bei Arrays, die bei 0 beginnen.
Ähm, ich denke, du beziehst dich auf diesen Lib-Eintrag: Dort wird ein dynamisches Array als Datenquelle deklariert:
ausblenden Delphi-Quelltext
1:
2:
3:
type
  TArrayElement = Integer;
  TArray = array of TArrayElement;
Diese können nicht anders als bei 0 beginnen. Wenn du die Voraussetzungen änderst, dann ist das kein Fehler im Code, wenn es anschließend nicht mehr funktioniert. :nixweiss:

user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube, der Quelltext müsste so aussehen:
Ja, das sieht gut aus. :zustimm: Ich habe das mal mit in den Lib-Beitrag aufgenommen, grundsätzlich hast du Recht, macht´s allgemeiner und damit besser. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: Mo 22.02.10 09:55 
:flehan: Entschuldigung, großer Narses! :flehan:

Natürlich war Dein Quelltext fehlerfrei. Ich hatte die Sache mit den dynamischen Arrays übersehen.
Irritiert hatte mich das Low(aArray), da man ja dann auch 0 schreiben könnte, wenn das Array sowieso bei 0 beginnt.

ub60
:lol: :lol:
Ralfi89 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 23.02.10 09:27 
Guten Morgen ,

danke für die tollen feedback. Scheint 27.94 nicht ein bisschen hoch als Erwartungswert?
Ich bin grad dabei mein mathematischen Ansatz zu vervollständigen und es hackt gerade etwas ( Anforderung ist 3 Semester Stochastik) und ich mache gerade erst Abitur .
Könnte mir jemand mal den vollständigen Quellcode/Programm via Pm schicken?
Danke für eure Hilfe
Lg
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 23.02.10 11:02 
Moin!

user profile iconRalfi89 hat folgendes geschrieben Zum zitierten Posting springen:
Könnte mir jemand mal den vollständigen Quellcode/Programm via Pm schicken?
Warum nur per PN? Dann hast nur du was davon, das ist nicht der Sinn eines Forums. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Di 23.02.10 15:05 
Hallo,

Ich habe den vollständigen Code ohne Kommentare dort oben stehen, o.k. nur als Konsolenprogramm.

Der Erwartungswert ist zwar sehr hoch vom ersten Anschein, aber man kann sich doch überlegen, wie er zustande kommt.
Erste Möglichkeit: 32 taucht unter den ersten 4 Karten auf ist sind schon 4/32 wo maximal ein 4-er Stapel entsteht.
Wie betrachtet man es denn günstig?
Ich habe hier Wahrscheinlichkeiten mit einer Odrnungsbeziehung, nicht einfach rote/weiße Kugeln oder unsortierte Lottozahlen.
Mal ein Gedanke die Zahlen 1 bis 6 genau aufsteigend zu ziehen hat die Wahrscheinlichkeit 1/6!
Gibt es also nur einmal von 720 Möglichkieten.
Wenn also 32 an Position 6 steht wird nur einmal ein 6-er Kartenstapel entstehen.
Vielleicht sollte man es einfach mal 6 Karten und Ausgabe aller Moeglichkeiten probieren

Gruß Horst