Ok, ich denke es ist an der Zeit mal genauer den "Sinn" des Projektes zu erläutern.
Im Prinzip geht es um ein OnlineGame.
Bei diesem Spiel ist es möglich Waffen mithilfe von Edelsteinen zu veredeln. (Um Schaden zu erhöhen...)
Hierbei gibt es Waffenstufen von 0 bis 15.
Für jeden Up-Versuch wird ein Stein benötigt.
Es besteht eine 50%-Chance dass der Versuch erfolgreich ist (Stufe wird um eins erhöht)
Schlägt der Versuch fehl, wird die Stufe verringert (Allerdings nur falls die neue Stufe nicht unter 3 liegt...d.h. bei einem Fehlschlag bei Stufe 0,1,2 oder 3 bleibt alles wie es ist).
Ziel ist es einen Simulator dazu zu schreiben, welcher die Steine zählt die man braucht um eine Waffe von 0 auf 15 zu bringen.
Quelltext ist folgender:
Delphi-Quellcode:
while Akt<>Config.Ziel
do //Akt = Aktuelle Stufe
begin
if Rnd>31
then begin R:=Random(MaxInt); Rnd:=0;
end;
//Letztes Bit meines 32Bit Random-Werts => Neue Zahl
if (R
and (1
shl Rnd))<>0
then //Aktuelles Bit true?
Inc(Akt)
//Eins Hoch
else if Akt>3
then Dec(Akt);
//Sonst wenn Stufe>3 dann runter
Inc(C);
//Versuch zählen
Inc(Rnd);
//Nächstes Bit
end;
Ich hoffe es ist klar dass ein "nicht zufälliger zufallsgenerator" mir nicht weiterhilft
Ein weiteres Problem, welches mir soeben aufgefallen ist ist der Array den ich für meine Ergebnisse nutze...
insgesamt sieht das so aus:
Delphi-Quellcode:
TUpper =
class
// ...
FRes64:
array of Int64;
end;
procedure TUpper.Generate(Cnt: Int64);
var Akt, Rnd: Byte;
C, Len: Int64;
R: Integer;
begin
Len:=Length(FRes64);
Rnd:=255;
R:=0;
while Cnt>0
do
begin
Akt:=Config.Start;
C:=0;
while Akt<>Config.Ziel
do
begin
if Rnd>31
then begin R:=Random(MaxInt); Rnd:=0;
end;
if (R
and (1
shl Rnd))<>0
then
Inc(Akt)
else if Akt>3
then Dec(Akt);
Inc(C);
Inc(Rnd);
end;
if C>=Len
then
begin
Len:=C+1;
SetLength(FRes64,Len);
end;
Inc(FRes64[C]);
Dec(Cnt);
end;
end;
in anbetracht der Tatsache dass Random nur 22 Cycles benötigt, liegt es vielleicht doch eher am SetLength?
(Wie) kann man das optimieren?
Daher stellt sich mir nun die Frage ob man hier überhaupt noch groß optimieren kann...(Aber da vertrau ich ganz auf euch
)
Im Moment braucht diese Funktion so wie sie da steht für 100.000.000 Durchläufe 386 Sekunden auf einem AMD 3000+ (seperater Thread, tpLower, Opera,Miranda usw im Hintergrund laufend)