Das Geburtstagsparadoxon
-
guude,
ich gehe zur zeit probeklausuren durch, und soll nun eine simulation des geburtstagsparadoxon[1] schreiben. ich dachte ich "dokumentere" das ganze hier ein wenig, und ihr koennt euren senf dazu geben und mir etwas hilfestellung geben. ich hab noch ein paar verstaendnisschwierigkeiten. ja, nicht ganz uneigennuetzig das ganze, ich gebs ja zu. aber es kommt ja immer auf das "wie" an ...
zu allererst die aufgabenstellung:
Sie sollen das "Geburtstagsparadoxon" aus der Wahrscheinlichkeitsrechnung durch eine Simulation überprüfen. Hierbei wird untersucht, wieviele Personen in einer Gruppe sein müssen, damit die Wahrscheinlichkeit dafür, dass es zwei Personen in dieser Gruppe gibt, die am selben Tag Geburtstag haben, größer als 50% ist. Erstaunlicherweise ist dies schon für relativ kleine Gruppen der Fall (daher die Bezeichnung "Geburtstagsparadoxon").
das gegebene klassendiagramm:
http://img204.imageshack.us/my.php?image=klassendiagrammrm8.png
und hier meine klassenimplementationen:/* * Group.h * Geburtstagsparadoxon * */ #ifndef GROUP_H #define GROUP_H #include "Date.h" class Group { private: Date birthdays[200]; int size; public: Group(); bool birthdayOnTheSameDay(); void sort(); void print(); bool isFull(); }; #endif/* * Date.h * Geburtstagsparadoxon * */ #ifndef DATE_H #define DATE_H class Date { private: int dayInYear; int year; public: Date(); void setRandomDate(); int getDayInYear(); int getDayInMonth(); int getMonth(); int getYear(); void print(); }; #endifhier sind erlaeuterungen zu den ersten 2 methoden der klasse Date.h
Der Standardkonstruktor von Date soll das erzeugte Objekt auf ein zufälliges Datum setzen, wie unter setRandomDate beschrieben.
setRandomDate soll die Datenelemente dayInYear und year unter den folgenden Randbedingungen setzen: dayInYear soll auf zufällige Weise so gesetzt werden, dass jeder der 365 Tage eines Jahres (Schaltjahre werden nicht berücksichtigt) mit der gleichen Wahrscheinlichkeit auftritt. Der Wert für year soll zufällig und gleichverteilt aus dem Bereich 1950 bis 2007 (jeweils einschließlich) genommen werden.
hier meine erste implementation des standardkonstruktors und der setRandomDate funktion:
// standardkonstruktor Date::Date() { dayInYear = 0; year = 0; int dateZufallsDatum = 0; dateZufallsDatum = 1 + rand() % 365; cout << "Vom Standardkonstruktor gesetztes Zufallsdatum: " << dateZufallsDatum << endl; }// setRandomDate void Date::setRandomDate() { dayInYear = 0; year = 0; const int ANFANGSJAHR = 1950; const int ENDJAHR = 2007; const int DIFFERENZ = ANFANGSJAHR - ENDJAHR; cout << "Funktion setRandomDate: "; int zufallsDatum = 0; zufallsDatum = 1 + rand() % 365; dayInYear = zufallsDatum; cout << "setRandomDate Zufallsdatum "; cout << zufallsDatum << endl; for(int i = ANFANGSJAHR; i <= ENDJAHR; i++) { int welchesJahrWirdAusgegeben = 0; welchesJahrWirdAusgegeben = 1 + rand() % DIFFERENZ; year = welchesJahrWirdAusgegeben; } cout << "Zufallsjahr zwichen 1957 und 2007: "; cout << year << " " << endl; }und die main.cpp
// main.cpp // #include "Group.h" #include "Date.h" #include <iostream> using namespace std; #include <cstdlib> using std::rand; using std::srand; #include <ctime> using std::time; int main (int argc, char * const argv[]) { // insert code here... srand(time(0)); Date neuesDatum; neuesDatum.setRandomDate(); return 0; }waere super wenn jmd mein bisheriges "werk" absegnen koennte. bzw mir sagt was ich besser machen kann oder schon richtig gemacht habe.
danke und gruss,
buk--- links ---
[1] http://de.wikipedia.org/wiki/Geburtstagsparadoxon
-
die schleife in setRandomDate ist ganz unnötig.
"aus dem Bereich 1950 bis 2007 (jeweils einschließlich)"
geht mityear=1950+rand()%(2007-1950+1);
-
volkard schrieb:
die schleife in setRandomDate ist ganz unnötig.
"aus dem Bereich 1950 bis 2007 (jeweils einschließlich)"
geht mityear=1950+rand()%(2007-1950+1);danke schonmal! ich haette alle besonderheiten der methoden posten sollen... deine funktion bringt mich mit folgenden methoden in "diskrepanzen" ...
getDayInMonth und getMonth sollen den im Datenelement dayInYear gespeicherten Tag in der üblichen Form ‚Tag im Monat’ bzw. ‚Monat’ zurückgeben. Hat dayInYear also z.B. den Wert 35, gibt getDayInMonth den Wert 4 und getMonth den Wert 2 zurück.
print soll das im Date -Objekt enthaltene Datum in der Form ‚04.02.1992’ auf dem Bildschirm ausgeben.
wenn ich die methode um diese uhrzeit richtig verstanden habe, muss ich dann die zahl - zwischen 1950 und 2007 - die ich mit meiner schleife rausbekomme so umrechnen wie angegeben:
Hat dayInYear also z.B. den Wert 35, gibt getDayInMonth den Wert 4 und getMonth den Wert 2 zurück.
oder... ?!
gruss,
buk
-
Die ganze Date Klasse ist IMO unnötig

Die Jahreszahl wird sowieso beim Vergleich ignoriert, die hat bloss Einfluss darauf ob es einen 29. Feb. gibt. Das kann man IMO viel einfacher lösen, indem man die Nummer des Tages (vom 1. Jänner weg gezählt) in einen int knallt. Den 29. Feb. übergeht man dabei beim Zählen, und hängt ihn hinten an.
Das Erstellen eines Geburtsdatums reduziert sich dadurch aufbool is_leap_year = ...; int date = get_random_number(365 + is_leap_year);Die Group-Klasse würde ich auch weglassen. IMO macht es bei dieser Aufgabe kaum Sinn irgendwelche eigenen Klassen zu definieren. Maximal eine Klasse für die gesamte "Simulation".
-
hustbaer schrieb:
Die ganze Date Klasse ist IMO unnötig

Die Jahreszahl wird sowieso beim Vergleich ignoriert, die hat bloss Einfluss darauf ob es einen 29. Feb. gibt. Das kann man IMO viel einfacher lösen, indem man die Nummer des Tages (vom 1. Jänner weg gezählt) in einen int knallt. Den 29. Feb. übergeht man dabei beim Zählen, und hängt ihn hinten an.
Das Erstellen eines Geburtsdatums reduziert sich dadurch aufbool is_leap_year = ...; int date = get_random_number(365 + is_leap_year);Die Group-Klasse würde ich auch weglassen. IMO macht es bei dieser Aufgabe kaum Sinn irgendwelche eigenen Klassen zu definieren. Maximal eine Klasse für die gesamte "Simulation".
es soll keine schaltjahre geben.
ich halte die Group-klasse für eine recht passende idee.
-
guude,
hustbaer schrieb:
Die Group-Klasse würde ich auch weglassen. IMO macht es bei dieser Aufgabe kaum Sinn irgendwelche eigenen Klassen zu definieren. Maximal eine Klasse für die gesamte "Simulation".
ich kann da nichts weglassen, die aufgabestellung ist so und so aenlich wird auch die klausur aufgabe.
volkard schrieb:
es soll keine schaltjahre geben.
ich halte die Group-klasse für eine recht passende idee.genau, schaltjahre werden nicht beruecksichtigt. die klasse Date soll die klasse Group unterstuetzen. so ich versuche nun mal die methoden getDayInMonth und getMonth gebacken zu bekommen und melde mich heute abend nochmal.
danke schonmal fuer eure antworten.
gruss,
buk
-
Oh, sorry, wenn das zur Aufgabenstellung gehört... kannst du wohl nicht aus.