Seite 1 von 1

Verstehe ich die Aufgabe so richtig?

Verfasst: Donnerstag 28. September 2017, 20:20
von gabba110
Gute Abend,
ich bin gerade dabei Python zu lernen und bin auf diese Aufgabe hier gestoßen, bei der ich anscheinen etwas falsch verstehe. Denn so wie ich die Aufgabe angehe, ist es unmöglich sie zu lösen. Über eine Hilfe eurerseits würde ich mich sehr freuen.
mfg Tina

[codebox=text file=Unbenannt.txt]
Simulation eines Zerfallsprozesses:
Schreiben Sie ein Programm, das die mittlere Lebensdauer von Lebwesen, die in einem
Zeitschritt mit Wahrscheinlichkeit p = 1/6 sterben, simuliert.
Hinweis: Fur die Simulation des Zufalls k ¨ onnen Sie eine Funktion des Pakets ¨ numpy
verwenden. Importieren Sie am Anfang Ihres Programms das Paket wie folgt
import numpy as np
Wenn Sie nun a=np.random.uniform() setzen, so bekommt die Variable a
einen zufallig zwischen 0 und 1 gew ¨ ahlten Wert. (Die Werte sind nicht wirklich ¨
zufallig, aber zuf ¨ allig genug.)
[/code]
Meine Lösung wäre:

Code: Alles auswählen

import numpy as np
i = 1

while i < 100:
    a=np.random.uniform()
    if a == 1/6:
        print (i,":","dead",a)
        
    else: 
        print (i,":","not dead",a)
         
    i = i + 1

Re: Verstehe ich die Aufgabe so richtig?

Verfasst: Donnerstag 28. September 2017, 20:44
von __deets__
Schau dir mal bitte for-Schleifen an - das spart dir viel unnötigen Code.

Und deine Todesbedingung ist falsch. Das exakt ein bestimmter wert einer Wahrscheinlichkeitsverteilung eintritt ist sehr unwahrscheinlich. Du willst ja in 1/6 ALLER Fälle sterben. Das bedeutet einen anderen Operator statt == zu nehmen.

Last but not least sollst du doch bestimmt auch den Schnitt über die Sterbezyklen bilden. Dazu musst du sie alle speichern. Dazu nimmst du eine Liste.

Re: Verstehe ich die Aufgabe so richtig?

Verfasst: Donnerstag 28. September 2017, 21:05
von gabba110
Ich werde mir die for-Schleifen mal anscheuen, danke für den Tipp.
Also wäre i<=1/6 besser ?
wie meinst du das mit Sterbezyklen?

Sry, wenn ich mich etwas doof anstelle, aber fragen kostet ja nichts:)

Re: Verstehe ich die Aufgabe so richtig?

Verfasst: Donnerstag 28. September 2017, 21:40
von __deets__
Wie kommst du denn jetzt auf i <= 6? Deine Wahrscheinlichkeit ist doch a.

Und wenn dein Programm läuft, stirbt dein Lebewesen bei schritt x. Und was weißt du jetzt? Nix. Mein Opa ist 87 geworden. Werden deswegen alle Opas 87? Nein. Also musst du doch eine Statistik über viele Lebewesen führen. Und die alle sterben lassen, und dann kannst du eine mittlere Lebenserwartung bilden. Mit programmieren hat das ja erstmal gar nix zu tun. Nur mit nachdenken. Das dann einem Computer beizubringen ist der nächste Schritt.

Re: Verstehe ich die Aufgabe so richtig?

Verfasst: Freitag 29. September 2017, 08:44
von __deets__
Aus Spaß mal gebaut weil ich selbst schlecht in Statistik bin. Das Ergebnis liegt nahe am erwartungswert der Pascal-Verteilung.

Code: Alles auswählen

import random
from itertools import count
import math
from collections import defaultdict


N = 100000
P = 1/6
deaths = defaultdict(int)

for _ in range(N):
    for age in count():
        if random.random() < P:
            deaths[age] += 1
            break
            
            
print(deaths)
print(sum(i*age for age, i in deaths.items()) / N)


Re: Verstehe ich die Aufgabe so richtig?

Verfasst: Freitag 29. September 2017, 11:41
von kbr
@gabba110: Die Aufgabenstellung ist etwas unglücklich formuliert, da sowohl der Begriff Zerfallsprozess als auch mittlere Lebensdauer vorkommt. Letzterer ist bei Zerfallsprozessen eher unüblich, hier wird normalerweise mit der Halbwertszeit gerechnet. Beide sind aber mathematisch korreliert und die mittlere Lebensdauer ist dann erreicht, wenn die Anfangspopulation auf ca. 37% abgesunken ist. Das kann man pro Einzel-Lebewesen berechnen, so wie auch __deets__ dies getan hat, oder für die Gesamtpopulation. Je größer die Anfangspopulation, desto ähnlicher die Ergebnisse. Die Auswertung kannst Du auch plotten und bei logarithmischer Darstellung sehr einfach die gewünschten Ergebnisse abgreifen.

Code: Alles auswählen

import random

P = 1/6
N_0 = 100000
GENERATIONS = 40

# betrachte jedes Lebewesen:
populations = [N_0]
for _ in range(GENERATIONS):
    populations.append(sum(1 for _ in range(populations[-1]) if random.random() >= P))
print(populations)

# einfacher: betrachte das Gesamtensemble:
populations = [N_0]
for _ in range(GENERATIONS):
    populations.append(int(populations[-1] * (1-P)))
print(populations)