Autor Beitrag
klezmor
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: So 13.03.05 20:57 
Hallo erst einmal, bin neu in diesem Forum.
Weiß jemand, wie man ein ein array erstellt in dem 10 werte(1..10) zufälliger Reihenfolge stehen? :?:
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 13.03.05 21:00 
das array kannst du so mit zufallszahlen füllen: RANDOM, RANDOMIZE
musst nur dein array mit einer for-schleife durchlaufen.

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: So 13.03.05 21:03 
Ja klar das stimmt, aber ich will 10 verschiedene Werte.
Bei der Funktion random kann es sein, dass ein Wert 2* im array ist.
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 13.03.05 21:07 
dann brauchst du eine schleife in der schleife, welche überprüft ob in den bereits belegten feldern der wert schon vorkommt.

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: So 13.03.05 21:15 
ja genau das habe ich mir auch gedacht, aber die procedur die ich geschrieben habe funktioniert leider nicht, ich habe jetzt den logischen Fehler gefunden, aber leider keine Lösung gefunden
procedure TForm1.FormActivate(Sender: TObject);
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:
var zue:array[1..10]of integer;
d,u:integer;
begin
randomize;
for u:=1 to 10 do

  begin


  zue[u]:=random(10);

  end;
for u:=1 to 10 do

  begin

  for d:=1 to 10 do
   begin
     if (zue[u]=zue[d])and (d<>u)
     then
     begin
        repeat
        zue[u]:=random(10)

        until (zue[u])<>(zue[d]);



     end;


   end;

   end;

u:=1;

end;


Immer noch sind werte dopppelt in dem array enthalten, ich weiß nicht wie ich das lösen soll.

Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt.
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 13.03.05 21:24 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure zufall;
  var arr:array[1..10]of integer;
  i,j,x:integer;
  label jump;
begin
  randomize;
  for i:=1 to 10 do begin
    jump:
    x:=random(10)+1;
    for j:=1 to i-1 do if x = arr[j] then goto jump;
    arr[i]:=x;
  end;
end;

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...


Zuletzt bearbeitet von retnyg am So 13.03.05 21:55, insgesamt 4-mal bearbeitet
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 13.03.05 21:28 
Edit. Sorry der vorgeschlagene Code erzeugt keine wirklich zufällige Reihenfolge. Hab den Code deswegen gelöscht.


Zuletzt bearbeitet von delfiphan am So 13.03.05 21:55, insgesamt 2-mal bearbeitet
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: So 13.03.05 21:33 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure zufallarray(var zufallarr:array of integer;laenge:integer);
var kontrollarray:array [0..11of boolean;
    i,zufall:integer;

begin
for i:= 0 to (laenge-1do
    begin
    kontrollarray[i]:=false;                //Vorbelegen als Nicht markiert
    end;
randomize;
i:=0;
while (i<=(laenge-1)) do
      begin
      zufall:=random(laenge);
      if (kontrollarray[zufall]=false) then  //Wenn Zahl noch nicht erzeugt
         begin
         zufallarr[i]:=zufall;
         kontrollarray[zufall]:=true;        //Zahl als erzeugt markieren
         inc(i);                             //Nächste Zahl
         end;
      end;
end;
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 13.03.05 21:58 
Sorry, Kroni, aber deine Methode gibt auch keine wirklich zufällige Reihenfolge zurück.
Edit: Sorry, ähh doch, deine funktioniert.
Heute bin ich ein wenig durcheinander ;)


Zuletzt bearbeitet von delfiphan am So 13.03.05 22:01, insgesamt 1-mal bearbeitet
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 13.03.05 22:00 
habe meine funktion noch etwas optimiert 8)
btw die variante von delphi-fan ist nicht schlecht, querdenker-style
edit: warum nicht wirklich zufällig, delfiphan ?

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 13.03.05 22:19 
Ist nicht gleichverteilt. Ist schon ziemlich zufällig, die grösseren Zahlen sind dann aber eher bei den hohen Indizes.
Hier, der Algorithmus nach Fisher-Yates:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Const
 Count = 10;
Var
 A : Array[0..Count-1of Integer;
 I, J, T : Integer;
begin
 For I := 0 to Count-1 do
  A[I] := I;
 For I := 0 to Count-1 do
 begin
  J := I+random(Count-I);
  T := A[J];
  A[J] := A[I];
  A[I] := T;
 end;
end;
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: So 13.03.05 22:22 
also, wenn wir mal bei der Randomfunktion sind:
ich hab mal ein Prog hochgeladne dass die Zufälöligkeit der Randomfunktion testet;-)
ps: meine Funktion da oben ist vollkommen ok;-)
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 13.03.05 22:31 
delfiphan hat folgendes geschrieben:
J := I+random(Count-I);

hier nimmt der bereich der zufällig generierten zahlen nach oben hin ab, sprich bei I=9 ist die zufallszahl immer 0 oder 1 - was soll nun daran besser sein als in deinem vorigen code ?

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...


Zuletzt bearbeitet von retnyg am So 13.03.05 22:31, insgesamt 1-mal bearbeitet
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 13.03.05 22:31 
@retnyg: Der alte Code ging durchs Array und vertauschte dabei jeden Eintrag mit einem zufällig gewählten anderen Eintrag. Dabei konnte es vorkommen, dass ein Eintrag, der schon "gesetzt" wurde, nochmals später verschoben wird. Das darf nicht sein, sonst sind nicht alle Zahlen gleichberechtigt. Die korrigierte Version berücksichtigt das: Es macht den Bereich, wo vertauscht werden darf, bei jedem Schritt kleiner.
// Edit: Hab dein Post erst jetzt gelesen. Es geht wirklich nicht, ich hab 1'000'000 solche Arrays berechnen lassen und die Mittelwerte berechnet. Bei der alten Version sind nicht alle Zahlen gleichberechtigt. Mit der Korrektur nach Fisher-Yates funktioniert's dann tip top.
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: So 13.03.05 22:43 
user profile iconKroni hat folgendes geschrieben:
also, wenn wir mal bei der Randomfunktion sind:
ich hab mal ein Prog hochgeladne dass die Zufälöligkeit der Randomfunktion testet;-)
ps: meine Funktion da oben ist vollkommen ok;-)

EDIT: Zum Prog, das ist im Info unterricht entstanden^^
mist, hab wohl den falschen button erwischt
sry warkeine absich,t dass ich da zwei beiträge raus gemacht hab
@mods: fasst das bitte mal wieda zu einem zusammen!


Zuletzt bearbeitet von Kroni am So 13.03.05 23:43, insgesamt 1-mal bearbeitet
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 13.03.05 22:47 
user profile icondelfiphan hat folgendes geschrieben:
ich hab 1'000'000 solche Arrays berechnen lassen und die Mittelwerte berechnet.

könntest du dieses mittelwert projekt mit source hier posten ?
edit: du hast nämlich sicher deine plot-unit eingebunden - würde mich interessieren wie du damit die statistische verteilung anzeigst.

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 13.03.05 23:18 
Neein, keine Plots! 10 Zahlen kann man ja noch überblicken ;)
ausblenden 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:
Abweichungen des Mittelwertes zum Erwartungswert bei 30'000'000 Auswertungen:

Vorher:
0: Abweichung: -0.38117515
1: Abweichung: -0.22602511
2: Abweichung: -0.09327648
3: Abweichung: 0.01631218
4: Abweichung: 0.09955808
5: Abweichung: 0.15273031
6: Abweichung: 0.17332643
7: Abweichung: 0.15728608
8: Abweichung: 0.10131005
9: Abweichung: 0.00008742

Nachher (ca. 50% drüber, 50% drunter => tip top):
0: Abweichung: 0.00021398
1: Abweichung: 0.00028029
2: Abweichung: -0.00018273
3: Abweichung: -0.00013189
4: Abweichung: 0.00023619
5: Abweichung: -0.00017557
6: Abweichung: -0.00030752
7: Abweichung: 0.00041279
8: Abweichung: -0.00018368
9: Abweichung: -0.00016186

Eine simple Mittelung konvergiert nur mit 1/sqrt(t), deswegen ist der Mittelwert selbst bei 30'000'000 Auswertungen nur auf einige Nachkommastellen genau.

//Edit: Es gibt doch n Plot ;)
Blau ist vorher und rot ist nachher.
Einloggen, um Attachments anzusehen!
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Do 17.03.05 14:33 
Danke für eure Beiträge, habe das Problem jetzt so gelöst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
randomize;
  for g:=1 to k do
  begin
   hilfsarr[g]:=g;
  end;

 for g:=1 to k do

    begin
      z[g]:=random(k)+1;
     while (hilfsarr[z[g]]=0do begin
      Z[g]:=random(k)+1end;

    hilfsarr[z[g]]:=0;

    end;


allerdings weiss ich immer noch nicht, wieso das array mit hilfe dieses codes:


ausblenden 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:
procedure TForm1.FormActivate(Sender: TObject);
var d:integer;
begin
  randomize;
  for g:=1 to 10 do

   begin

     z[g]:=random(10)+1;

         for d:=1 to 10 do
          begin

           while (((z[g])=(z[d]))and (d<>g)) do
           begin

              z[g]:=random(10)+1;


           end;

          end;



   end;
   g:=1;
end;


keine 10 verschiedenen Werte abgespeichert hat, sondern Zahlen auch doppelt vorkamen

Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Do 17.03.05 14:53 
user profile iconklezmor hat folgendes geschrieben:
allerdings weiss ich immer noch nicht, wieso das array mit hilfe dieses codes:
...
keine 10 verschiedenen Werte abgespeichert hat, sondern Zahlen auch doppelt vorkamen


Ganz einfavch, schau den Code mal an: Du gehst al serstes in eine Schelife und belegst z[g] mit einem Zufallswert, sagen wir mal z.B. das ist ne 5. jetzt gehst du dein Array nochmal urch und schaust nach ob nochmal wo ne 5 vorkommt (angenommen g sei mal 6, kommt 5 vllt nochmal bei z[2] (also d=2) vor). Okay, dann sagst du gut, passt net, will ich da net haben, also belegen wir z[6] neu. Jetzt belegst du z[6] neu und zwar wieder mit einer Zufallszahl, sagen wir, die sei 3 (nun also z[6] = 3). Jetzt überprüft dir dir whlile schleife nochmal, ob z[6] = z[2] <=> 3 = 5, das ist definitiv falsch, dann beendet deine Shcleife und fertig, nächstes g. ABER: du überprüfst jetzt nicht, ob die 3 nochmal im array für ein kleineres d vorkommt (also im beispiel für z.B. d = 1)! Da liegt der Fehler!
Hoffe man kann meinem Beispiel ein bisschen folgen ;)



MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Do 17.03.05 15:17 
Danke jetzt habe ich es verstanden, mir fällt es nicht leicht so um die Ecken zu denken.