Verstehe ich die Aufgabe so richtig?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gabba110
User
Beiträge: 16
Registriert: Donnerstag 28. September 2017, 20:13

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
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
gabba110
User
Beiträge: 16
Registriert: Donnerstag 28. September 2017, 20:13

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:)
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)

Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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)
Antworten