Autor |
Beitrag |
Regan
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: So 16.09.07 15:17
Hy,
ich habe ein Problem mit meinem Quellcode. Ich weiß nicht, was schneller ist- Ich gebe mal ein Beispiel(mit deutlich weniger Variablen als ich habe; bei mir sind es ca. 80):
Mit Variablen 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:
| procedure Tjaja.jaja(); var a,ab,abc,abcd:Integer; tempboolean:Boolean; begin a:=random(50);
repeat tempboolean:=false; ab:=random(50); if ab<>a then tempboolean:=true; until tempboolean;
repeat tempboolean:=false; abc:=random(50); if abc<>a then if abc<>ab then tempboolean:=true; until tempboolean;
repeat tempboolean:=false; abcd:=random(50); if abcd<>a then if abcd<>ab then if abcd<>abc then tempboolean:=true; until tempboolean; end; |
Oder sollte ich es lieber mit dieser Variante probieren:
Array 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure Tjaja.jaja(); var myarray:Tarray[0..3] of Integer; i, o:Integer; tempboolean:Boolean; begin For i:=0 to 3 do begin myarray[i]:=random(50); if i=0 then continue; tempboolean:=true; repeat For o:=i-1 downto 0 do begin if myarray[o]=myarray[i] then tempboolean:=false; end; until tempboolean; end; end; |
Mir gefällt die zweite Variante irgendwie vom schreiben her besser, aber ich weiß nicht, ob sie auch schneller ist. Vielleicht kann mir jemand helfen. Danke im Vorraus.
MfG
Regan
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 16.09.07 15:27
Bei Dir geht es drum 80 zufällige Zahlen zu ermitteln, die keine Dopplungen enthalten?
In dem Fall ist rein von der Wartung die zweite Variante besser. Außerdem lässt sich mit einem Array sogar noch eine weitere Optimierung einbauen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure Tjaja.jaja(); const MaxRandom = 50; var myarray: array[0..3] of Integer; usedarr: array[0..MaxRandom - 1] of boolean; i:Integer; begin FillChar(UsedArr[0], SizeOf(UsedArr), #0);
For i:=0 to 3 do begin Repeat myarray[i]:=random(MaxRandom); Until not UsedArr[MyArr[i]]; UsedArr[MyArr[i]] := True; end; end; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Regan 
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: So 16.09.07 15:33
Vielen Dank für die schnelle Anwort.
BenBE hat folgendes geschrieben: | Bei Dir geht es drum 80 zufällige Zahlen zu ermitteln, die keine Dopplungen enthalten? |
Richtig.
BenBE hat folgendes geschrieben: | In dem Fall ist rein von der Wartung die zweite Variante besser. Außerdem lässt sich mit einem Array sogar noch eine weitere Optimierung einbauen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure Tjaja.jaja(); const MaxRandom = 50; var myarray: array[0..3] of Integer; usedarr: array[0..MaxRandom - 1] of boolean; i:Integer; begin FillChar(UsedArr[0], SizeOf(UsedArr), #0);
For i:=0 to 3 do begin Repeat myarray[i]:=random(MaxRandom); Until not UsedArr[MyArr[i]]; UsedArr[MyArr[i]] := True; end; end; | |
Könntest du vielleicht mir erklären, was in den einzelnen Schritten passiert (Kommentare reichen zu )?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 16.09.07 15:37
Naja: ganz einfach:
In der Repeat-Schleife wird in jedem Durchlauf eine Zufallszahl ermittelt und geprüft, ob wir diese schon hatten.
Wenn nicht, wir nach der Schleife markiert, dass wir diese bereits hatten (nämlich jetzt grad  ).
Übrigens kann man in begrenzten Zahlenbereichen auf diese Weise recht schnell (nämlich linear) sortieren
Ach ja: Zeile 9 initialisiert nur das Array auf alles False ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Zuletzt bearbeitet von BenBE am So 16.09.07 15:41, insgesamt 2-mal bearbeitet
|
|
Regan 
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: So 16.09.07 15:39
Ja. Das klingt verständlich. Vielen Dank nochmals.
|
|
|