Author Topic: Simulation von Logistik und Materialflusssystemen  (Read 2314 times)

pruefi

  • Hero Member
  • *****
  • Posts: 504
  • Karma: +0/-0
    • View Profile
    • https://www.linkedin.com/in/andreaspruefer/
Simulation von Logistik und Materialflusssystemen
« on: April 30, 2008, 11:56:41 pm »
Hab schnell mal Q'n'D einen LCG http://de.wikipedia.org/wiki/Linearer_Kongruenzgenerator geschrieben, bitte um Tests: compiliert in Delphi (zzgenerator, 44KB) und Freepascal (zz1,1MB) ohne Probleme.
Benutzung mit Parameterübergabe ansonsten werden Standartwerte verwendet.
Ziel ist die Ausgabe in eine Pipe oder die Standartausgabe
Beispiele:
zzgenerator >Test.txt
zzgenerator -o=C -n=100000 -m=1 -b=31 >Test.txt

Die Ausgabe läßt sich durch geignete Trennzeichen beliebig formatieren ZB alles in eine Spalte um die Datei in Excel zu benutzen ;-)
Code: [Select]
program zzgenerator;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  Math;

// Zufallszahlengenerator nach Modulo
// Zi:=(Z_0*a+c)mod (m+2^b)  n-Anzahl der zu liefernden Werte
//

type ZG = class
         z0:Extended;
         a,c,m,n,b: Integer;
         function gen(z:Extended):Extended;
         constructor Create;
end;

function REST(A,B:Extended):Extended;
begin
Result:=A-(Int(A/B))*B;
end;

function grosse_Zahl(Z:Extended):WideString;
var I:Integer; N1,N2:Extended;
begin
for I:=Round(Int(log10(Z))) downto 1  do
        begin
        N1:=Rest(Z,Power(10,I));
        N2:=Int(Z/Power(10,I));
        write(IntToStr(Round(N2)));
        Z:=N1;
        end;
end;

function ZG.gen(z:Extended):Extended;
begin
Result:=REST(((z*a)+c),(m+Power(2,b)));
end;


constructor ZG.Create;
begin
inherited Create();
a:=13821;
m:=Round(Power(2,15));
c:=0;
n:=100;
z0:=10;
b:=0;
end;

var
        Z,Z0:Extended;
        I: Integer;
        Generator: ZG;
        ENDE:Boolean;
        DEL:String;




procedure ausgang(STR:String);
begin
write(STR+DEL);
end;



procedure USAGE;
begin
writeln('*******************************************************************************');
writeln('               Zufallszahlengenerator Linearer Kongruenzgenerator'+#13#10 +
'                        Z=(a*Z+c)mod (m+2^b) auf Extended beschraengt'+#13#10+
'Benutzung: zzgenerator [-a=A] [-b=B] [-m=M] [-n=N] [-c=C] [-z=Z] [-o=R|C|Trennzeichen] [-h|-?]'+#13#10+
'Standartwerte sind:  A=13821; M=2^15;C=0;N=100;Z:=10;R=Reihe,C=Spalte'+#13#10+'h-> diese Hilfe');
writeln('*******************************************************************************');
end;

procedure werte_Parameter_aus;
var param,wert: string; I:Integer;
begin
for I:=1 to ParamCount
        do begin
        param:=Copy(ParamStr(i),0,2);
        wert:=Copy(ParamStr(i),4,20);
        if param='-n' then
                begin
                try
                        Generator.n:=StrToInt(wert);
                except
                end;
                end;
        if param='-z' then
                begin
                try
                        Generator.z0:=StrToInt(wert);
                except
                end;
                end;

         if param='-a' then
                begin
                try
                        Generator.a:=StrToInt(wert);
                except
                end;
                end;

         if param='-m' then
                begin
                try
                        Generator.m:=StrToInt(wert);
                except
                end;
                end;
          if param='-c' then
                begin
                try
                        Generator.c:=StrToInt(wert);
                except
                end;
                end;
          if param='-b' then
                begin
                try
                        Generator.b:=StrToInt(wert);
                except
                end;
                end;
           if (param='-h') or (param='-?') or (param='/h') then
                begin
                      USAGE;
                      ENDE:=True;
                end;
           if param='-o' then
                begin
                if wert='C' then DEL:= #13#10;
                if wert='R' then DEL:=' ';
                if (wert <> 'C') and (wert <>'R') then
                        begin
                                try
                                        DEL:=wert;
                                except
                                end;
                        end;
                end;
end;
end;



begin
DEL:=' ';
Generator:=ZG.Create;
ENDE:=False;
//Standartbelegung
werte_Parameter_aus;
   // Insert user code here
if not ENDE  then
begin
        Z0:=Generator.z0;
        ausgang(FloatToStr(Z0));
        begin for I:=1 to Generator.n
        do begin
                Z:=Generator.gen(Z0);
                //ausgang('');
                ausgang(FloatToStrF(Z,ffFixed,18,0));//+#13#10);
                //grosse_Zahl(Z);
                //ausgang(#13#10);ausgang(#13#10);
                 //ausgang('');
                Z0:=Z;
        end;
end;
end;

end.
[align=center][/align]