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
IPhythonFeststeckProblem
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:
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
Und noch ein Nachtrag: falls es dir wirklich nur um inkrementieren geht: das funktioniert entweder ganz einfach ohne viel Magie mit
oder kompakter mit
[codebox=c file=Unbenannt.c]x += 1[/code]
Code: Alles auswählen
x = x +1
[codebox=c file=Unbenannt.c]x += 1[/code]
-
- 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
so, nun nochmal in "schön"
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
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!
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!
@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:
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:
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:
Jetzt brauchst Du nur noch ein Hauptprogramm, das Samples erzeugt, diese analysiert und das Ergebnis aufsummiert.
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)
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
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