


/*	zuf_lin_kongr.c - Programm berechnet eine Folge von Zufallszahlen	*/
/*	mittels der "Methode der linearen Kongruenz"				*/

/* -- includes ----------------------------------------------------------------	*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

/* -- main() ------------------------------------------------------------------	*/
int main(void){
	long a, b, m, i, anz;
	long long *x;

	printf(	"Zufallszahlengenerator\n"
		"----------------------\n\n");
	printf(	"Eine Folge von Zufallszahlen wird mittels folgender Methode berechnet:\n"
		"\t\t\"x[i+1]:=(a*x[i]+b) mod m\"\n\n");

	printf("Wieviele Zufallszahlen sollen berechnet werden?: "); scanf("%ld", &anz);
	// reservieren von Speicher für anz viele Zufallszahlen
	if((x=(long long *)malloc(anz*sizeof(long long)))==NULL){
		perror("-> Fehler bei malloc()");
		printf("--> Programmabbruch...\n\n");
		return 1;
	}

	// Einlesen der restlichen Variablen
	printf("Wie groß soll der Faktor a sein?:  ");	scanf("%ld", &a);
	printf("Wie groß soll der Summand b sein?: ");	scanf("%ld", &b);
	printf("Wie groß haben Sie m gewählt?:     ");	scanf("%ld", &m);
	printf("Welchen Wert soll x[0] haben?:     ");	scanf("%Ld", &x[0]);
	printf("\n\nDie Folge Ihrer Zufallszahlen lautet:\n");

	// Berechnen der Folge von Zufallszahlen und Ausgabe; die beiden for-Schleifen
	// hätten natürlich auch zusammen gefasst werden, die getrennte Schreibweise soll
	// hier nur bekräftigen, dass man mit dem entstandenen Feld von Zufallszahlen
	// auch weiter rechnen könnte...
	for(i=0; i<anz-1; ++i)
		x[i+1]=(a*x[i]+b)%m;

	for(i=0; i<anz; ++i){
		if(!(i%8)) printf("\n");
		printf("%Ld, ", x[i]);
	}

	printf("\n\n");
	// Speicher wieder freigeben
	free(x);

	return 0;
}

