IPhythonFeststeckProblem

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
Wasserglas
User
Beiträge: 12
Registriert: Donnerstag 30. November 2017, 11:48

Moin moin! =)

Ich hab ein kleines Problemchen, ich studiere atm Informatik und hänge in einer der gegebenen Aufgaben fest, nein ich will nicht das ihr mir meine Aufgabe erarbeitet, ich bin nur leider noch nicht so weit in Python das mir alles auf Anhieb gelingt und gerade hänge ich komplett :/
(Und Sorry für den titel, mir is nix gescheites eingefallen^^)

Zum Problem:
Ich habe ein kleines Programm geschrieben( das hoffentlich richtig ist) das 2 Werte ausspuckt, diese will bzw soll ich in einer for-Schleife unterbringen damit sie zusammen gerechnet werden können.
Wichtig ist vllt noch das das ganze in iPhyton- Notebook stattfindet und es sich um Mathe dreht(obwohl die Info wohl überflüssig ist...)
----------------------------------------------
import random as rand

stoerungS5Verbunden = 0
keineStoerungVerbunden = 0

p = 0.3

def versuch ():
# >=p weil unter 0.3 der Fehler ausgelöst wird
s1 = rand.random() >=p
s2 = rand.random() >=p
s3 = rand.random() >=p
s4 = rand.random() >=p
s5 = rand.random() >=p


#geht alternativ zu not auch =! ?
if not s5 and ((s1 and s4) or (s2 and s3)):
stoerungS5Verbunden = +1

return stoerungS5Verbunden

elif (s1 and s4) or (s2 and s3) or (s1 and s5 and s4) or (s2 and s5 and s3):
keineStoerungVerbunden = +1 # ++ geht nicht

return keineStoerungVerbunden

Das ist das bisherige Programm das nun seine Werte in diese (noch nicht ganz fertige) For-Schleife Schmeißen soll

-------------------------------------------

for i in range (15000):
xxx

M = stoerungS5Verbunden / keineStoerungVerbunden *100


-----
Die Preisfrage ist nun, wie bekomme ich diese vermalledeiten Werte da rein?
Ich hoffe meine Frage ist nicht so doof das niemand Antworten mag :/

Mfg Wasserglas
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte benutz die code-tags hier im Editor um deinen Python Code auszuzeichnen. Denn so ist er nicht lesbar bzw. veraendert sogar seine Bedeutung, weil die Einrueckungen verschwinden.

Was dein Problem angeht: so ganz klar ist mir das nicht. Was augenscheinlich ist: wenn du x Variablen anlegst mit durchnummerierten Namen, dann willst du eigentlich eine Liste mit x Werten darin. Und wenn du das so aufbaust, dann hast du danach zb auch ein einfaches Tool um die Anzahl der positiven Experimente zu bestimmen:

Code: Alles auswählen

experimente = [ random.random() > p for _ in range(anzahl)]
erfolgreich = sum(experimente) / anzahl
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und noch ein Nachtrag: falls es dir wirklich nur um inkrementieren geht: das funktioniert entweder ganz einfach ohne viel Magie mit

Code: Alles auswählen

x = x +1
oder kompakter mit

[codebox=c file=Unbenannt.c]x += 1[/code]
Wasserglas
User
Beiträge: 12
Registriert: Donnerstag 30. November 2017, 11:48

Also ersma hi und danke für die schelle Antwort :)

Ich hab tatsächlich komplett vergessen die Aufgabe dazu zu schreiben ^^

Zusammengefasst: Ich hab 5 Punkte in einem Schaltnetz, an jedem dieser Punkte tritt zur Wahrscheinlichkeit von 0.3 ein Verbindungsfehler auf.
Und ich soll herausfinden wie oft in s5 ein Fehler auftritt und das 15000 mal testen

Code: Alles auswählen

import random as rand

stoerungS5Verbunden = 0
keineStoerungVerbunden = 0
        
p = 0.3

def versuch ():
    # >=p weil unter 0.3 der Fehler ausgelöst wird
    s1 = rand.random() >=p
    s2 = rand.random() >=p
    s3 = rand.random() >=p
    s4 = rand.random() >=p
    s5 = rand.random() >=p
        
        
    #geht alternativ zu not auch =!  ?
    if not s5 and ((s1 and s4) or (s2 and s3)):
        stoerungS5Verbunden = +1
        
        return stoerungS5Verbunden
        
    elif (s1 and s4) or (s2 and s3) or (s1 and s5 and s4) or (s2 and s5 and s3):
        keineStoerungVerbunden = +1 # ++ geht nicht
        
        return keineStoerungVerbunden


for i in range (15000):
    xxx
    
M = sum(stoerungS5Verbunden) / sum(keineStoerungVerbunden) *100

so, nun nochmal in "schön"
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah.

Du solltest das anders loesen: Statt auf globale Variablen zurueckzugreifen, musst du einfach nur in deiner Funktion versuch zurueckgeben, ob es zu einer Stoerung kam.

Das Ergebnis ist also True oder False, und weil das gleichzeitig 1 und 0 sind bzw. sich so verarbeiten lassen, musst du die Ergebnisse deiner 15000 Versuche nun einfach in einer Liste sammeln, bzw. kannst die eigentlich auch gleich in einer Schleife aufsummieren.

Was du NICHT tun solltest ist die aufsummierung in der Funktion zu machen! Denn damit graebst du dich in ein Loch, in dem die Funktion zu viel kann und nicht mehr fuer andere Aufgabenstellungen zu gebrauchen ist. Globaler Zustand ist boese!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Wasserglas: erstmal zum Kommentar: `!` gibt es als Operator nicht. Das boolsche Nicht ist `not`.

Dann solltest Du Funktionen, die Daten erzeugen von denen, die sie verarbeiten trennen, und sprechende Namen vergeben:

Code: Alles auswählen


CONNECTION_ERROR_PROBABILITY = 0.3

def generate_connection_sample():
    return [rand.random() >= CONNECTION_ERROR_PROBABILITY for _ in range(5)]

def analyse_connections(s1, s2, s3, s4, s5):
    s1_to_s4 = (s1 and s4) or (s2 and s3)
    if not s5 and s1_to_s4:
        stoerungS5Verbunden = +1
        return stoerungS5Verbunden
    elif s1_to_s4:
        keineStoerungVerbunden = +1 # ++ geht nicht
        return keineStoerungVerbunden

# Aufruf:
s1, s2, s3, s4, s5 = generate_connection_sample()
result = analyse_connections(s1, s2, s3, s4, s5)
In `analyse_connections` habe ich nur die Bedingungen vereinfacht, damit man klarer sehen kann, wo es noch Probleme gibt. Noch mehr vereinfacht, sieht die Funktion so aus:

Code: Alles auswählen

def analyse_connections(s1, s2, s3, s4, s5):
    s1_to_s4 = (s1 and s4) or (s2 and s3)
    if s1_to_s4:
        if not s5:
            return 1
        else:
            return 1
falls die Kombination s1 bis s4 `False` ist, gibt die Funktion nichts zurück. Wie soll dieser Fall behandelt werden? Die anderen beiden Fälle sind identisch, weil es egal ist, ob die 1 vorher in einer Variable `stoerungS5Verbunden` oder `keineStoerungVerbunden` stand. Willst Du diese Unterscheidung machen, brauchst Du zwei Rückgabewerte:

Code: Alles auswählen

def analyse_connections(s1, s2, s3, s4, s5):
    s1_to_s4 = (s1 and s4) or (s2 and s3)
    if s1_to_s4:
        if not s5:
            return (1, 0)
        else:
            return (0, 1)
    return (0, 0) # Stoerung bei s1 bis s4
Jetzt brauchst Du nur noch ein Hauptprogramm, das Samples erzeugt, diese analysiert und das Ergebnis aufsummiert.
Antworten