 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Gh
Anmeldungsdatum: 04.05.2012 Beiträge: 3
|
Verfasst am: 04.05.2012, 11:57 Titel: Geburtstagsproblem |
|
|
Ich wollte das nachfolgende rekursive TrueBASIC Programm nach FreeBASIC portieren. Das ist mir bis jetzt erfolgreich NICHT gelungen, da die Resultate ziemlich daneben liegen. Variable, etc. habe ich deklariert.
Kontrollwerte wären etwa:
n=20, Wk=0.00824
n=40, Wk=0.0669
n=60, Wk=0.207 (entsprechend 20.7 %)
Code: |
'Georg Schrage: Geburtstagsproblem mit TrueBASIC
'Mit welcher Wahrscheinlichkeit haben drei von
'fünfzehn Personen (allgemein drei von n)
'am gleichen Tag Geburtstag?
'
function wk(n,z,e) 'Rekursive Def. der Funktion Wk
if z<0 or e<0 then
wk=0
else
if n=1 then
wk=1
else
wk=wk(n-1,z,e-1)*(366-z-e)+wk(n-1,z-1,e+1)*(e+1)/365
end if
end if
end def
input n
for z=0 to int(n/2)
w=wk(n,z,n-2*z)
s=s+w
next z
print 1-s
end
|
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 04.05.2012, 16:34 Titel: |
|
|
Hi Gh,
zunächst erstmal herzlich Willkommen im Forum.
Da deine Function so unter FB nicht laufen kann, hier mal mein Versuch einer Interpretation: Code: | Function wk(n As Integer, z As Integer, e As Integer) As Integer 'Rekursive Def. der Function Wk
If z<0 Or e<0 Then Return 0 'mit Funktionswert 0 beenden
If n=1 Then Return 1 'mit Funktionswert 1 beenden
Return wk(n-1, z, e-1)*(366-z-e)+wk(n-1, z-1, e+1)*(e+1)/365 'rekursiv den Funktionswert berechnen..
'Nachdenken: was hat /365 in einer Integer-Function zu suchen???
End Function 'korrektes Funktionsende, s.Hilfe..
|
Ich habs nicht ausprobiert..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 04.05.2012, 19:07 Titel: |
|
|
Hi Gh,
Die rekursive Funktion Wk ist zumindest als Single zu definieren.
Weiter ist die Rekursionsformel leider nicht vollständig.
Hier
http://stochastik-in-der-schule.de/sisonline/struktur/jahrgang22-2002/heft2/2002-2_Rottm.pdf
findest du die Formel (4).
Damit sind die Ergebnisse richtig (bei n=40 brauchst du aber schon sehr viel Geduld ) _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Gh
Anmeldungsdatum: 04.05.2012 Beiträge: 3
|
Verfasst am: 04.05.2012, 21:28 Titel: |
|
|
Hallo ytwinky und Volta
Besten Dank für den Willkomm und für eure schnelle Hilfe.
Wie Volta bemerkt hat bin an der fehlerhaften Rekursionsformel gescheitert. Das Listing war das Original in TrueBASIC.
Und hier der FreeBASIC-Code für 3er Geburtstage:
Code: |
''''''''''''''''''''''''''''''''''''''''''''''''
'Georg Schrage: Geburtstagsproblem mit TrueBASIC
'Mit welcher Wahrscheinlichkeit haben drei von
'fünfzehn Personen (allgemein drei von n)
'am gleichen Tag Geburtstag?
'
'Quelle:
'http://stochastik-in-der-schule.de/sisonline/struktur/jahrgang12-92/heft2/1992-2_Schr.pdf
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
dim te as single
dim ta as single
dim dt as single
dim s as double
dim w as double
dim n as integer
dim z as integer
dim e as integer
declare function wk(n as integer,z as integer,e as integer) as double
input n
ta=timer
for z=0 to int(n/2)
w=wk(n,z,n-2*z)
s=s+w
next z
te=timer
dt=te-ta
print 1-s, dt
sleep
end
'Rekursive Def. der Function Wk
Function wk(n As Integer, z As Integer, e As Integer) As double
If z<0 Or e<0 Then Return 0 'mit Funktionswert 0 beenden
If n=1 Then Return 1 'mit Funktionswert 1 beenden
Return wk(n-1, z, e-1)*(366-z-e)/365+wk(n-1, z-1, e+1)*(e+1)/365
End Function
|
Es ist schon lustig; im von Volta angegebenen Bericht von Rottmann ist die Formel richtig,
jedoch das Zahlenbeispiel für fünf Personen und 3er Geburtstag falsch, nämlich 5.2e-5 statt 7.476e-5.
Die rekursive Lösung scheitert, wie im Bericht beschrieben, schnell an der zu grossen Rechenzeit.
Eine rekursive, allgemeine Lösung des Problems kann man also vergessen.
Die analytische Lösung für 3er Geburtstage ist vieeel schneller.
Wenn es jemanden interessiert kann ich diese angeben. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 06.05.2012, 20:03 Titel: |
|
|
hi,
die Hinweis zum Nachdenken, war nicht für mich bestimmt..
Double-Functions sind sehr zeitaufwändig! Es ist keine schwere Aufgabe, herauszufinden, ob rekursive Double-Functions zeitaufwändiger sind!
Du kannst ja mal probieren, ob du Doubles nehmen mußt, oder ob, wie volta vorgeschlagen hat, die Deklaration als Single ausreicht..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 06.05.2012, 21:58 Titel: |
|
|
Hi ytwinky,
bei n=30 wird die Funktion Wk ~1.000.000.000 mal aufgerufen.
Jeder weitere Aufruf verdoppelt~ die Anzahl, dagegen ist Single oder Double das kleinere Problem. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 07.05.2012, 18:12 Titel: |
|
|
Danke für den Hinweis, volta
Ich hätte lieber eine Antwort von Gh gelesen..
..dann hätte ich nämlich noch einen Hinweis auf die Mathe-Library von TJF
in petto gehabt(um Gh weitere mathematischen Möglichkeiten von FB aufzuzeigen), aber das erübrigt sich ja nun..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Gh
Anmeldungsdatum: 04.05.2012 Beiträge: 3
|
Verfasst am: 14.05.2012, 17:55 Titel: |
|
|
Sorry ytwinky
War sieben Tage in den Wanderferien und ohne Internet. Habe aber durchaus Single und Double miteinander verglichen, darum die Zeitstopperei im Code. Die Library von TJF ist mir aus dem Forum in Englisch bekannt. Ich habe sie allerdings nicht durchforstet weil ich nach wie vor glaube, dass eine rekursive Lösung der falsche Ansatz ist. Ab 4er Geburtstage ist eine Simulation das weitaus Praktikabelste, aber halt mit eiber Unsicherheit behaftet. Man könnte sich fragen, ob man diese Unsicherheit abschätzen kann.
Beste Grüsse
Gh |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|