Bombentrichter
Archiv => 9./10. Semester => Vorlesungen/Übungen 9./10. Semester => Topic started by: pruefi 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 ;-)
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.