problem mit zufallsgenerator

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.
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

Hallo,
ich hab ein Problem:
Und zwa, wenn ich diesen Skript ausführe wird nichts ausgegeben wie ich eigentlich will, sondern kann nur mit eneter bestätigen, und das unenedlich lang!

Ich bin für Tipps offen und auch für verbesserungen, ich bitte aber vor allem um Problemlösung!!

Code: Alles auswählen

import random
a = random.randint(1, 15)
b1 = " "

x = 0
c = True
while c:
    a = random.randint(1, 15)
    if a >= 10:
        b1 = b1 + "E"
        x = x + 1
    elif a <= 12:
        b1 = b1 + "S"
        x = x + 1
    elif x == 79:
        
        c = False
    else:
        b1 = b1 + "G"
        x = x + 1
print b1
so sieht das in der Konsole aus:
>>>(enter)

>>>(enter)

...
enter steht für die Entertaste die ich drücke

danke schon mal an alle die versuchen mir zu helfenm, oder helfen können

Anhang: Bin nichtgerade ein Python Prof :mrgreen:
Ich weis erst was ich denke, wenn ich höre was ich sage!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie rufst Du denn das Script auf?

Und bitte benutze die Python-Code-Tags!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

ne, irendwann hab ich auch aufgehöhrt, aber wieso muss ich überhaubt mit enter bestätigen??

sry, dass ich falsche Frum erwischt hab
Ich weis erst was ich denke, wenn ich höre was ich sage!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BerryBlue hat geschrieben:ne, irendwann hab ich auch aufgehöhrt, aber wieso muss ich überhaubt mit enter bestätigen??
Musst Du ja eben gar nicht. Aber wie startest Du denn das Script? Du scheinst Dich ja in einer Shell zu bewegen... da musst Du es ja irgend wie aufrufen.

Man könnte natürlich zum Script selber vieles sagen - aber vermutlich sind es Hausaufgaben?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

zur ersten Frage:
ja ich benutze IDLE
zur zweiten Frage:
nein ich programmier als Hobby
Ich weis erst was ich denke, wenn ich höre was ich sage!
Benutzeravatar
pillmuncher
User
Beiträge: 1529
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

BerryBlue hat geschrieben:wenn ich diesen Skript ausführe wird nichts ausgegeben wie ich eigentlich will, sondern kann nur mit eneter bestätigen, und das unenedlich lang!

Code: Alles auswählen

while c:
    a = random.randint(1, 15)
    if a >= 10:
        b1 = b1 + "E"
        x = x + 1
    elif a <= 12:
        b1 = b1 + "S"
        x = x + 1
    elif x == 79:
        """ wenn genau beim 80. Durchlauf a _zugleich_ kleiner als 10 und größer als 12 ist, 
           beende die Schleife, ansonsten wiederhole unendlich weiter. """
        c = False
    else:
        b1 = b1 + "G"
        x = x + 1
print b1
Und das hier:
Ich weis erst was ich denke, wenn ich höre was ich sage!
Sollte das nicht heißen:
Ich weiß erst, was ich programmiere, wenn ich lese, was ich tippe!
?
In specifications, Murphy's Law supersedes Ohm's.
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

sry weiss ned was du meinst
aber wieso muss ich bestätigen ich hab ja kein raw_input() in meinem Skript :K

Anhang: ich find mein slogen ganz Ok :mrgreen:
Ich weis erst was ich denke, wenn ich höre was ich sage!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hehe... ich habs auch übersehen. Schau Dir mal pillmunchers Kommentar genau an. Dann kommst Du auch drauf.

Tipp: Wenn man eine Schleife irgend wann abbrechen will, sollte man die Bedingung bei jedem Durchlauf prüfen; zumindest wenn es nach jedem Durchgang erfüllt sein kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

danke hab verstenden , hier mein neuer skript:

Code: Alles auswählen

import random
a = random.randint(1, 15)
b1 = " "

x = 0
c = True
while c:
    if x == 79:
        
        c = False
    a = random.randint(1, 15)
    if a >= 10:
        b1 = b1 + "E"
        x = x + 1
    elif a <= 12:
        b1 = b1 + "S"
        x = x + 1
    
    else:
        b1 = b1 + "G"
        x = x + 1
print b1
Ich weis erst was ich denke, wenn ich höre was ich sage!
Benutzeravatar
pillmuncher
User
Beiträge: 1529
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

BerryBlue hat geschrieben:danke hab verstenden
Super! Jetzt musst du nur noch rauskriegen, warum in b1 nie ein 'G' steht. Tipp: lies meinen o.s. Kommentar nochmal, am besten dreimal und gaaaaaaanz laaaaangsaaaaam und LAUT!
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So, wobei wir nun noch mal den Rest bewerten können:

1.) Wieso das Flag `c` - Du kannst die Schleife doch auch direkt per `break` verlassen. Was uns dann zu der Frage bringt, wieso Du überhaupt `while` benutzt und nicht gleich eine `for`-Schleife, die 80 mal durchlaufen wird? Dann wäre auch das `x` überflüssig. Zudem erhöhst Du `x` bei der aktuellen Struktur einmal pro Durchlauf - das musst Du nicht dreimal formulieren, sondern kannst das einmal hinschreiben ;-) Aber das Ändern in eine `for`-Schleife ist eh sinnvoller.

2.) Wieso speicherst Du die Ergebnisse nicht in einer adäquaten Struktur, wie einer Liste? Diese kannst Du dann am Schluss ja ganz einfach per `"".join()` zu einem String zusammenbauen.

3.) Der Aufruf von `randint` außerhalb der Schleife ist sinnlos

4.) Was sollen eigentlich "E", "S" und "G" bedeuten?

5.) Und wir haben hier immer noch PYTHON-CODE-TAGS ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

hab jetzt ca 10 mal gelesen, verstehn tu ichs trotzdem ned
Ich weis erst was ich denke, wenn ich höre was ich sage!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Nenne uns doch mal eine Zahl aus Deinem Zufallsbereich, die eine der beiden oberen Bedingungen *nicht* erfüllt. Denn nur dann kommst Du ja in den `else`-Zweig.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

hab de Code noch mal vereinfacht, haffe es passt jetzt;(er funktioniert sogar :mrgreen: )

Code: Alles auswählen

import random

b1 = " "

x = 0
c = True
while c:
    if x == 79:
        
        c = False

    else:
        x = x + 1
        a = random.randint(1, 3)
        if a == 1:
            b1 = b1 + "E"
        elif a == 2:
            b1 = b1 + "S"
        else:
            b1 = b1 + "G"
print b1        

Ich weis erst was ich denke, wenn ich höre was ich sage!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hast Du Dir mal mein Posting hier durchgelesen? Da bleibt noch viel Luft nach oben... ;-)

Edit: Nach dieser Umformulierung geht das alles sogar noch kompakter!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

@hyperion:ne sry hab ich ueberlesen
ich galub ich hab die <> vertauscht oder??
Ich weis erst was ich denke, wenn ich höre was ich sage!
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BerryBlue hat geschrieben:hab de Code noch mal vereinfacht
Vereinfacht sieht es etwa so aus:

Code: Alles auswählen

data = ''.join(['ESG'[random.randint(0,2)] for _ in xrange(80)])
print(data)
Edit - oder so:

Code: Alles auswählen

data = ''.join([random.choice('ESG') for _ in xrange(80)])
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@/me: Man kann `join` einfach einen Generator-Ausdruck übergeben ;-)

Code: Alles auswählen

data = ''.join('ESG'[random.randint(0,2)] for _ in xrange(80))
print(data)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:@/me: Man kann `join` einfach einen Generator-Ausdruck übergeben ;-)
Ich hatte daran gedacht, es dann aber nicht ausprobiert weil ich der Meinung war es ginge nicht. :oops: Wieder was gelernt. :D
BerryBlue
User
Beiträge: 41
Registriert: Mittwoch 9. November 2011, 19:57

kann mir das jetzt irgendjeman mal erklären??
Ich weis erst was ich denke, wenn ich höre was ich sage!
Antworten