Autor |
Beitrag |
klezmor
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: 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
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: 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
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: 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
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: 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
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: 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);
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 AXMD: Delphi-Tags hinzugefügt.
|
|
retnyg
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: So 13.03.05 21:24
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
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: So 13.03.05 21:33
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..11] of boolean; i,zufall:integer;
begin for i:= 0 to (laenge-1) do begin kontrollarray[i]:=false; end; randomize; i:=0; while (i<=(laenge-1)) do begin zufall:=random(laenge); if (kontrollarray[zufall]=false) then begin zufallarr[i]:=zufall; kontrollarray[zufall]:=true; inc(i); end; end; end; |
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: So 13.03.05 22:00
habe meine funktion noch etwas optimiert
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
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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:
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-1] of 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
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: 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
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: 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
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: So 13.03.05 22:43
Kroni 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
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: So 13.03.05 22:47
delfiphan 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
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 13.03.05 23:18
Neein, keine Plots! 10 Zahlen kann man ja noch überblicken
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
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Do 17.03.05 14:33
|
|
MrSaint
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Do 17.03.05 14:53
klezmor 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
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Do 17.03.05 15:17
Danke jetzt habe ich es verstanden, mir fällt es nicht leicht so um die Ecken zu denken.
|
|