Beispieldaten generieren?
-
Hallo, ich hoffe, dass ich im ANSI C Forum richtig bin. Ich habe fünf Beispieldateien in denen Vornamen, Nachnamen, Strassennamen und Städte stehen. Jeder Eintrag steht in einer einzigen Zeile. Daraus soll ich eine zufällige Anordnung von 10 Millionen Personendaten generieren. Neben den Feldern Name, Vorname, Strasse und Ort soll noch ein zufälliges Geburtsdatum zwischen dem 01.01.1900 und dem 31.07.2006 erzeugt werden. Beachten sie Schaltjahre.
Zufällige Doppel sind erlaubt. Bei der Vergabe des Geburtsdatums soll darauf geachtet werden, dass es sehr viel mehr jüngere als sehr alte Menschen gibt.
Das Ergebnis ist dabei in eine neue Datei "Personen.csv" zu schreiben. Dabei ist folgendes Format zu verwenden.Name;Vorname;Strasse,Ort;TT.MM.YYYY
In einer zweiten Teilaufgabe sollen die 1000 ältesten Menschen ermittelt werden. Die in Teilaufgabe a) erzeugte Beispieldatei darf nur einmal durchlaufen werden. Das Programm darf nicht mehr als 2000 Datensätze gleichzeitig im Speicher halten. Die Ausgabe der so ermittelten Personengruppe soll nach dem Alter sortiert erfolgen. Bei gleichaltrigen Personen soll die in der ursprünglich in a) generierte Reihenfolge erhalten bleiben.
Ich soll das alles in C implementieren. Das mit den Datensätzen funktioniert schon fast. Nur wie mache ich das mit den Schaltjahren? Wie erzeuge ich eine zufällige Verteilung so, dass ich tatsächlich weniger alte als junge Menschen in der "Sammlung" habe?
Bei der zweiten Teilaufgabe verstehe ich überhaupt nicht, wie das gehen soll.
Könnt ihr mir ein wenig helfen?Danke
-
Wenn es dir um den Zufall geht, solltest du dir mal man: rand ansehen - erzeug dir einfach genug Zufallswerte, die du dann als Index in einem String-Array (Namen etc) bzw. Datums-Bestandteil (oder komplettes Datum als time_t) interpretieren kannst.
Zur Verwaltung der Geburtsdaten empfehle ich dir die Funktionen aus der <time.h>.
(zur Aufgabe 2: Du nimmst dir ein Array mit 1000 Datensätzen und fügst per Insertion Sort die Datensätze richtig ein, was über die Grenze 1000 rüberläuft, kannst du vergessen)
-
Fuer die Altersverteilung benoetigst Du eine Verteilungsfunktion. Eine passende waere wahrscheinlich so etwas wie
\(y = e^{(-(x/\sigma)^2)}\)
wobei Du sigma z.B. auf 40 setzt, so dass es Menschen zwischen 0 und etwa 120 Jahren gibt. (Bei sigma=40 sind etwa 2/3 aller Menschen juenger als 40, kannst Du variieren).Dann erzeugst Du zwei Zufallsvariablen,
x_zufall zwischen 0 und 120 (das sind die alter in Jahren) und y_zufall zwischen 0 und 1.
Falls y_zufall <= e{(-(x_zufall/\sigma)2)},
so akzeptierst Du das Paar und nimmst x als Alter. Du kannst dann x mit 365 mutliplizieren, damit Du das Alter in Tagen bekommst.
Falls y_zufall > e{(-(x_zufall/\sigma)2)}, so verwirfst Du das Paar und erzeugst erneut zwei Zahlen.
So wird die Altersverteilung der obigen Funktion folgen. Du kannst natuerlich auch jede andere Funktion einsetzen.