Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Geburtstagsproblem

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Gh



Anmeldungsdatum: 04.05.2012
Beiträge: 3

BeitragVerfasst am: 04.05.2012, 11:57    Titel: Geburtstagsproblem Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 04.05.2012, 16:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 04.05.2012, 19:07    Titel: Antworten mit Zitat

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 geschockt )
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Gh



Anmeldungsdatum: 04.05.2012
Beiträge: 3

BeitragVerfasst am: 04.05.2012, 21:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 06.05.2012, 20:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 06.05.2012, 21:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 07.05.2012, 18:12    Titel: Antworten mit Zitat

Danke für den Hinweis, volta zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Gh



Anmeldungsdatum: 04.05.2012
Beiträge: 3

BeitragVerfasst am: 14.05.2012, 17:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz