Autor Beitrag
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: 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):
ausblenden 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:
ausblenden 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..3of 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:

ausblenden 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..3of Integer;
    usedarr: array[0..MaxRandom - 1of 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: So 16.09.07 15:33 
Vielen Dank für die schnelle Anwort.
user profile iconBenBE hat folgendes geschrieben:
Bei Dir geht es drum 80 zufällige Zahlen zu ermitteln, die keine Dopplungen enthalten?

Richtig.
user profile iconBenBE 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:

ausblenden 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..3of Integer;
    usedarr: array[0..MaxRandom - 1of 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: So 16.09.07 15:39 
Ja. Das klingt verständlich. Vielen Dank nochmals.