Statistik Aufgabe Python

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.
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

Es geht um eine große Aufgabe, die ich lösen möchte aber beim Anfang ein Problem habe und zwar lautet die Aufgabe:

Schreiben Sie in Python eine Methode X, welche zufällig reelle Zahlen (floats) zwischen 5 und 8 aus gibt, sodass die Wahrscheinlichkeit für eine Zahl zwischen 5 und 6 doppelt so groß ist wie zwischen 6 und 7, analog die Wahrscheinlichkeit zwischen 6 und 7 doppelt so groß wie zwischen 7 und 8 ist. Innerhalb der Intervalle [5,6),[6,7) und [7,8) sollen die Zahlen gleichverteilt sein.
Tipp: implementieren Sie zunächst eine Zufallsvariable Y mit Werten in {5,6,7} und einer geeigneten Verteilung, schreiben Sie dann X=Y+.....

Mein Problem ist erst einmal wie X = Y + .. gemeint ist genau ?
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

ich würde meinen ansatz posten aber leider wurde mein beitrag nicht freigeschaltet
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

MathGenie123 hat geschrieben: Montag 18. April 2022, 13:56 ich würde meinen ansatz posten aber leider wurde mein beitrag nicht freigeschaltet
Es ist Ostersonntag, und die Sonne scheint. Ich hoffe mein Drang zur Frischluft hat dir nicht allzuviel Unbequemlichkeit zugemutet.
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

hahaha der war gut ja okay, melde mich morgen nochmal :) , aber ich würde gerne wissen wie man bei schnellantworten code postet ?
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: In welcher Zeitzone bist Du gerade? Bei mir ist schon Montag. Aber das mit der Sonne stimmt. 😇
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich meinte auch Montag.

@MathGenie123: du kannst die Code Tags auch einfach von Hand eingeben.

Und zu deiner Aufgabe: wenn du eine Verteilung für Y hast, musst du einfach nur die standardmäßige Gleichverteilung von 0..1 der random.random funktion dazuaddieren.
dirk009
User
Beiträge: 27
Registriert: Donnerstag 3. Juni 2021, 21:49

Hallo @MathGenie123,

die Aufgabe ist eigentlich ziemlich klein. Nachdem @deets den zweiten Teil erklärt hat. Hier eine Idee zum ersten Teil. Bei der Gleichverteilung von einem Würfel mit sieben Seiten ist die Wahrscheinlichkeit, eine von zwei bestimmte Zahlen zu erhalten, doppelt so gross wie die Wahrscheinlichkeit, eine bestimmte Zahl zu erhalten. Ebenso ist die Wahrscheinlichkeit, eine von vier bestimmten Zahlen zu erhalten, doppelt so gross wie die Wahrscheinlichkeit, eine von zwei bestimmten Zahlen zu erhalten. Also kannst du die Wahrscheinlichkeitsverteilung mit der Gleichverteilung durch Zuordnung der Zahlen simulieren.

Code: Alles auswählen

from random import randint, random

def y():
    random_value = randint(1,7)
    if random_value == 1:
        return 5
    if random_value == 2 or random_value == 3:
        return 6
    return 7 # random_value in [4,5,6,7]

def x():
    return y() + random()

if __name__ == '__main__':
    [print(x()) for _ in range(0,10)]
Beispielausgabe:

Code: Alles auswählen

7.011883602433043
6.913770049751413
7.0054181930861175
5.035501614027626
6.500347804210461
7.549870524346216
5.248128535731663
6.57574929536881
7.063994066178143
6.5281501833064866
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dirk009: Der Kommentar ist irreführend, oder übersehe ich da eine Möglichkeit, dass tatsächlich eine 4 von `y()` zurückgegeben werden kann. 🤔

Mit der Liste mit den 10 `None`-Werten wird gar nichts gemacht. Warum wird die erstellt?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

Code: Alles auswählen

from random import random as r
from sample_of_x import sample
import math
import random

Y = {5,6,7}
def verteilung(x):
    p = 1/7
    if(x == 7):
        p = p
    if(x == 6):
        p = 2*p
    if(x==5):
        p=4*p
        
    return p

def X():
    x= random.randrange(5, 7, 1)  + r()
    
    return x
    



so habe ich das gelöst ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das random so zu r zu verkuerzen ist ungewoehnlich und erschwert das Verstaendnis. Es ist ein typischer Anfaengerfehler zu glauben, der getippte Buchstabe waere irgendwie teuer. Ist er nicht. Die Zeit, die beim verstehen des eigenen Codes irgendwann mal unnoetig bei drauf geht, hingegen schon. Und das uebt man schon von Anfang an, nicht erst, wenn's drauf ankommt - so wie alles andere auch.

Die Funktion verteilung ist falsch, aber auch nicht benutzt. Und dirk009 hat doch eine Funktion fuer y geschrieben. Was daran ist unklar?
dirk009
User
Beiträge: 27
Registriert: Donnerstag 3. Juni 2021, 21:49

__blackjack__ hat geschrieben: Montag 18. April 2022, 20:59 @dirk009: Der Kommentar ist irreführend, oder übersehe ich da eine Möglichkeit, dass tatsächlich eine 4 von `y()` zurückgegeben werden kann. 🤔
@blackjack

Ich wollte nicht

Code: Alles auswählen

  if random_value in  [4,5,6,7]:
	return 7 
in der Methode schreiben und der Kommentar sollte deutlich machen, dass 7 in diesen Fällen zurückgegeben wird.
__blackjack__ hat geschrieben: Montag 18. April 2022, 20:59 Mit der Liste mit den 10 `None`-Werten wird gar nichts gemacht. Warum wird die erstellt?
Ursprünglich wollte ich noch ein Histogramm plotten und habe eine Liste von Zufallswerten erzeugt. Dann war ich aber doch zu faul und habe einfach ein print eingebaut.
dirk009
User
Beiträge: 27
Registriert: Donnerstag 3. Juni 2021, 21:49

MathGenie123 hat geschrieben: Dienstag 19. April 2022, 15:51
so habe ich das gelöst ?
@MathGenie123

Nichts geht über einen Test. Ich habe folgendes zu deinem Code hinzugefügt:

Code: Alles auswählen

from collections import Counter
from math import trunc

if __name__ == '__main__':

    zufallszahlen = []
    intervalle = []
    for _ in range(0, 1000):
        x = X()
        zufallszahlen.append(x)
        intervalle.append(trunc(x))
    counter = Counter(intervalle)
    for key, value in counter.items():
        print(f"{key}: {value}")
        
Der Code erzeugt 1000 Zufallszahlen und zählt die Anzahl der Zahlen in den Intervallen.
Folgende Ergebnisse werden bei drei Testläufen erzeugt:

5: 486
6: 514


5: 507
6: 493

5: 496
6: 504

Eine Zufallszahl der Form 7.xxx wird nicht erzeugt und das Verhältnis zwischen 5er und 6er Intervall ist 1:1. Es sollte aber 2:1 sein.

PS: Bei meiner Lösung muss man die Zuordnung invertieren (7 statt 5 und 5 statt 7), um an die von der Aufgabenstellung gewünschte Verhältnisse zu kommen.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Das random-Modul liefert alles, was für diese Aufgabe nötig ist. Mit random.choices kann aus einer Menge [5, 6, 7] ein Element mit einer bestimmten Gewichtung gezogen werden, und mit random.random erhält man eine gleichverteilte Zahle zwischen [0,1).
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

also ich habe alles generiert, ich habe tausend zufallswerte mit dieser bedingung, was ich nun wissen möchte ist wie man den erwartungswert dort berechnet ? es liegt ja eine Gleichverteilung vor zwischen den einzelnen Intervallen ? wie geht man da um ?
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

Code: Alles auswählen

from random import random as r
import math
import random

Y = {5,6,7}
def verteilung(x):
    p = 1/7
    if(x == 7):
        p = p
    if(x == 6):
        p = 2*p
    if(x==5):
        p=4*p
        
    return p
    
    
def X():
    x= random.choices(population=[5, 6, 7], weights=[4/7, 2/7, 1/7], k=1)[0]  + r()
    
    return x


#generiere 1000 zufallswerte
random.seed(1)
stichprobe = []
for i in range(1,1001):
     stichprobe.append(X())
     
    




ich solle nun den erwartungswert bestimmen aber ka wie ich das für die reelen zahlen machen soll
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum ist da denn immer noch diese ueberfluessige verteilung-Funktion drin? Und auch das Y ist doch ueberfluessig.

Was ist denn die Definition des Erwartungswertes? Wie wuerdest du den denn fuer diskrete Wuerfelwuerfe zB berechnen?
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

wäre gut wenn einer hilft ?
das ist mein ansatz für den ewert

Code: Alles auswählen

erwartungswert = 0
for x in samp:
    if(x < 6):
        erwartungswert += x*(4/7)
    if(6 <= x < 7):
        erwartungswert += x*(2/7)
    if(7 <= x < 8):
        erwartungswert += x*(1/7)
        
        
erwartungswert


MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

die definition ist ja im grundegenommen nichts weiteres als wahrscheinlichkeit * wert der zv und alles aufsummiert.

mein ansatz steht schon oben
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zur `verteilung()`-Funktion würde ich auch noch anmerken, dass Gleitkommazahlen nicht ganz ohne Stolperfallen sind, weil die nicht exakt sind/sein müssen, und das man so etwas besser mit ganzen Zahlen löst. Lesetipp: https://floating-point-gui.de/
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

die funktion verteilung ist nicht so releveant eig, es geht nur um den erwartungswert und außerdem habe ich die floor function in meiner implementierung nur habe es nicht hochgeladen
Antworten