# Code von Brooks Ferebee ########################################################################## # Wir untersuchen das "Geburtstagsproblem" für eine "Folge" von Personen. # Wir nehmen an, dass die Geburtstage der Personen rein zufällig (und unabhängig) aus den 365 Tagen des Jahres gewählt werden (ohne Schaltjahre). # Wie lange dauert es, bis es zu einer "Kollision" kommt, d.h bis zwei Personen am selben Tag Geburtstag haben? # Um diese Frage zu untersuchen, simulieren wir so lange (rein zufälligen) Geburtstage, bis es zu einer Kollision kommt. #Wir notieren die (zufällige) Anzahl T der Geburtstage bis zur ersten Kollision und wiederholen den Vorgang ein paar Mal. ########################################################################## rm(list=ls()) ########################################################################## #Graphikparameter werden gesetzt quartz(width = 10, height =7, pointsize = 12, family = "Helvetica", antialias = TRUE) par(cex.main=1.3,cex.axis=1.0,cex.lab=1.0,pch=18) par(font.main=1,mar=c(5,5,5,5)) ########################################################################## #Der Kalender wird gezeichnet farbe<-c("ivory","lightblue","red") tagZeichnen<-function(tag,monat,f) { x<-tag-1 y<-12-monat h<-0.7 b<-0.8 polygon(c(x,x+b,x+b,x),c(y,y,y+h,y+h),col=farbe[f]) } monatslaenge<-c(31,28,31,30,31,30,31,31,30,31,30,31) monatsbuchstabe<-c("J","F","M","A","M","J","J","A","S","O","N","D") kalenderVorbereiten<-function() { plot(c(0,31),c(-1,13),t="n",axes=F,xlab="",ylab="",main="Geburtstage") for (monat in 1:12) { text(-0.9,12-monat+0.4,monatsbuchstabe[monat],cex=1.2) for (tag in 1:monatslaenge[monat]) tagZeichnen(tag,monat,1) } for (i in 1:length(nn)) text(2*i,-1,nn[i],col="red",cex=1.2) readline(0) } wsMonat<-monatslaenge/365 geburtstag<-function() { mm<-rmultinom(1,1,monatslaenge) monat<-sum(1:12*mm) tag<-sample(1:monatslaenge[monat],1) g<-treffer[monat,tag] treffer[monat,tag]<<-treffer[monat,tag]+1 f<-2 if (g==1) f<-3 tagZeichnen(tag,monat,f) g } nn<-c() # die bisherigen Werte von N neuerLauf<-function() { kalenderVorbereiten() kollisionen<-0 N<-0 treffer<<-array(0,dim=c(12,31)) while (kollisionen==0) { N<-N+1 kollisionen<-geburtstag() if (kollisionen>0) text(15,13,paste("T =",N),cex=1.2,col="red") readline(N) } nn<<-c(nn,N) nn<<-sort(nn) } ########################################################################## #Hauptprogramm nn<-c() # die bisherigen Werte von N for (i in 1:7) { neuerLauf() readline(100*i) } kalenderVorbereiten() readline(1000) txt<-paste("Median (T1,T2,T3,T4,T5,T6,T7) =",median(nn)) text(23,-1,txt,col="red",cex=1.2) ########################################################################## #Ende readline("Ende") graphics.off()