function Result = lcg(rows,columns,seed, config)
% Erstellt eine Matrix mit Zufallszahlen mittels dem LCG Algorithmus.
% Wenn kein seed angegeben wird, wird die aktuelle Uhrzeit benuetzt.
% 
% Erforderliche Parameter
% - rows:    Anzahl Reihen in der Matrix
% - columns: Anzahl Kolonnen in der Matrix
% 
% Optionale Parameter
% - seed:    Startwert fuer die Zufallszahlen-Reihe.
%            Default: now
% - config:  Konfiguration des LCG in der Form [ a c m ]
%            Default: [ 65339, 0, 2^32 ]

    %% If there is no given seed, use the current time as seed
    if ~exist('seed','var')
        seed = now;
    end

    %% Konfiguration des LCG mit dem Multiplikator (a), der Konstante (c) und dem Modulus (m) 
    if exist('config','var')
        dim = size(config);
        if (dim(2) ~= 3)
            error('Die Konfiguration muss eine Matrix der Form [ a c m ] sein.') 
        end
        a = config(1);
        c = config(2);
        m = config(3);    
    else
        % Diese Werte stammen vom Zufallsgenerator RANDU (Frueher sehr ueblich).
        a = 65539;
        c = 0;
        m = 2^32;
    end
        
    %% Generierung der Matrix mit Zufallszahlen
    % Beim ersten Durchgang wird der seed als letzte Zufallszahl
    % angenommen und mittels modulo in das Intervall [0 .. m] gelegt.
    r = mod(seed,m);
    
    Result = zeros(rows,columns);
    for row = 1:rows
        for col = 1:columns
            %% Berechnung der naechsten Zufallszahl basierend auf der letzten Zufallszahl
            r = mod(a*r + c, m);
           
            % Normalisiere das Resultat. D.h. das Resultat ist im Intervall [0, 1)
            Result(row,col) = r/m;
        end
    end
end