Python Zufallsgenerator: bestimmte Zahlen ausgrenzen

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

qEagleStrikerp hat geschrieben: Nun ja, gerne, aber da ich ja erstmal ein wenig in den Dokumentationen und meinem Buch für Python rumstöbern muss, denke ich nicht, dass ihr mir dabei viel helfen könnt ^^
Es ging mir um die PN an BlackJack. Es klang so, als würdest Du ihn dann gerne nur persönlich bezüglich von Fragen zu Deiner Umsetzung ansprechen wollen ;-)

Deine Frage an cofi verstehe ich nicht! Das solltest Du noch einmal besser formulieren. Evtl. mit einem Code-Beispiel?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

qEagleStrikerp hat geschrieben:@cofi: Wie funktioniert das mit "statt z1-z6"? Wird dabei für jedes Paar der Wert errechnet und dann alle 6 Werte in "zs" eingetragen?
Nun, teste es doch ;) Aber ja, du bekommst eine 6-elementige Liste (bei 6 Paaren) und jedes Element wird zufaellig aus dem entsprechenden Paar gewaehlt.
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

cofi hat geschrieben:Nun, teste es doch ;) Aber ja, du bekommst eine 6-elementige Liste (bei 6 Paaren) und jedes Element wird zufaellig aus dem entsprechenden Paar gewaehlt.
Okay, probiere ich dann mal. Danke!
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

qEagleStrikerp hat geschrieben:
cofi hat geschrieben:Nun, teste es doch ;) Aber ja, du bekommst eine 6-elementige Liste (bei 6 Paaren) und jedes Element wird zufaellig aus dem entsprechenden Paar gewaehlt.
Okay, probiere ich dann mal. Danke!
@Hyperion: Es ging mir nur darum, dass ich jemanden anschreibe, falls ich nach etwas Zeit dann antworte, aber keiner mehr in dem Thread unterwegs ist.
BlackJack

@qEagleStrikerp: Threads mit neuen Antworten wandern in der Übersicht wieder nach oben und sind ja auch durch ein entsprechendes Icon markiert. Ich denke so einfach werden da keine neuen Beiträge übersehen. Es gibt auch noch die beiden Links „Beiträge der letzten 24 Stunden” und „Ungelesene Beiträge” oben auf der Webseite.
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

BlackJack hat geschrieben:@qEagleStrikerp: Threads mit neuen Antworten wandern in der Übersicht wieder nach oben und sind ja auch durch ein entsprechendes Icon markiert. Ich denke so einfach werden da keine neuen Beiträge übersehen. Es gibt auch noch die beiden Links „Beiträge der letzten 24 Stunden” und „Ungelesene Beiträge” oben auf der Webseite.
Na gut, dann bis irgendwann in den nächsten Tagen, ich denke am Wochenende werde ich das auf jeden Fall schaffen.
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

Hi nochmal,
hatte die letzten Wochen leider nicht die Zeit dazu, aber hab mich heute nochmal damit beschäftigt.

1. Es macht keinen großen Sinn, jetzt eine Datenstruktur anzulegen, dadurch ändert sich an der Durchführung des Programms und damit auch meinem Problem nämlich gar nichts.

2. Ein Freund von mir (arbeitet mit Pascal und Delphi) meinte, bei ihm gäb es die Möglichkeit, über die Funktion "randomize" den Zufallsgenerator neu zu initialisieren. Das wäre genau das, was mein Problem lösen würde. Wie mache ich so etwas in Python?

Danke für eure Hilfe!
BlackJack

@qEagleStrikerp: 1. Doch es macht Sinn statt sich wiederholendem Code und durchnummerierten Namen eine Datenstruktur zu verwenden. Das Programm wird dadurch kürzer und verständlicher. Ausserdem leichter zu ändern weil man nicht mehrere Kopien vom im Grunde gleichen Code anfassen muss.

Ich hatte ja schon eine passende Funktion gepostet.

2. Das neu initialisiseren des Zufallsgenerators löst Dein Problem ganz sicher nicht, denn der wird bereits initialisert. Das ist bei Pascal/Delphi nicht der Fall, da muss man das tatsächlich selber machen.
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

@Black Jack: Schade, wäre zu schön gewesen. ^^ Dann werde ich das Programm mal umschreiben.
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

Hi nochmal,
habe das Programm jetzt auf "cofi" Art geschrieben und dabei ist folgendes rausgekommen:

Code: Alles auswählen

# -*- coding: cp1252 -*-

# Zufallsgenerator
import random

# DV-Paare
pairs = [(0,0),     #KP
         (0,0),     #Angriff
         (31,31),   #Verteidigung
         (0,0),     #Spez.-Angriff
         (31,0),    #Spez.-Verteidigung
         (31,0)]    #Initiative

# Auswahl für einzelne Werte
zs = [random.choice(pair) for pair in pairs]

# Auswahl der 3 vererbten Werte
chosen = list([random.choice(zs)])
print(chosen)
chosen.add(random.choice(list(zs-chosen)))
chosen.add(random.choice(list(zs-chosen)))

# Ergänzen der 3 zufälligen Werte
chosen.add(random.randint(0,31))
chosen.add(random.randint(0,31))
chosen.add(random.randint(0,31))

# Ausgabe
print(chosen)
Ich muss sagen, ihr habt recht, ist echt um einiges übersichtlicher. Aber es scheint Probleme mit den Listentypen zu geben. Wie löse ich das?

Danke im Voraus! ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Programmieren funktioniert nicht mittels Raten, du musst schon wissen was du machst. Was soll denn passieren, wenn du Listen von Listen subtrahierst, das ist doch ein wenig unsinnig. Die list-Aufrufe in den Zeilen 18, 20 und 21 deuten auch auf geraten hin. Die sind nämlich total überflüssig. Du suchst wahrscheinlich Mengen (sets). Zeilen 24 bis Ende sind wahrscheinlich auch nicht so gemeint, wie sie dort stehen. Da werden nämlich Tupel mit Integern in einer Liste vermischt. Verschiedene Datentypen in einer Liste möchte man normalerweise vermeiden.

Und dann noch ein wertvoller Hinweise: Schreibe Code niemals blind runter, sondern teste die Zwischenschritte. Bei dir schmiert das Programm ja schon relativ früh ab, der ganze Rest danach baut dann auf falschen Annahmen auf. Lasse deinen Code also zwischendurch mal laufen. Und wenn er irgendwo nicht durchläuft, dann behebe erst den Fehler und programmiere anschließen dahinter weiter.
Das Leben ist wie ein Tennisball.
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

Hi,
ich mach das normalerweise schon so. Auch heute. Nur bin ich bei dem Problem mit den Listen hängen geblieben, hab aber den restlichen Code schonmal eingetippt, sodass ich später nur noch Details ändern muss.
Btw: Das mit dem Listen voneinander subtrahieren hat im letzten Programm bereits funktioniert, wenn du dir die paar Nachrichten vor deiner mal durchliest. Das hat wirklich wunderbar funktioniert. Aber jetzt mit den Tupeln war das nicht mehr so leicht. Mir ist aufgefallen, dass es bei zs eine Liste mit [] ergibt und bei chosen eine mit {}. Ich hab vermutet, dass dort das Problem liegt, bin aber noch zu unerfahren um sowas zu lösen. Daher hab ich auch das aktuell fehlerhafte Programm online gestellt, damit mir bei eben diesem Problem geholfen werden kann.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@qEagleStrikerp: Der Unterschied zwischen [] und {} ist der, dass ersteres eine Liste und zweiteres ein Set erzeugt. Wenn Dir soetwas unklar ist, solltest Du es in der Python-Dokumentation nachlesen, statt es unverstanden zu verwenden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Vor allem sollte man solche Dinge sofort ad hoc in einer interaktiven Shell (aka REPL) austesten und damit experimentieren :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

Hi zusammen,
hab mich letztens mal wieder hingesetzt und das Programm komplett neu geschrieben, diesmal mit Dictionarys. Hab es dann in einem 2. Python Programm über "exec" in einer Schleife aufgerufen und schon kamen erwartete Werte raus.

Danke für eure Bemühungen!
BlackJack

@qEagleStrikerp: Warum um Himmels willen mit `exec`‽ Das ist mit Sicherheit nicht das richtige Werkzeug für so eine Aufgabe.
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

BlackJack hat geschrieben:@qEagleStrikerp: Warum um Himmels willen mit `exec`‽ Das ist mit Sicherheit nicht das richtige Werkzeug für so eine Aufgabe.
Erstaunlicherweise habe ich aber mit folgendem Code (ist nur ein Ausschnitt) genau die Werte bekommen, die ich zuvor theoretisch berechnet habe. Daher eignet es sich scheinbar doch.

Code: Alles auswählen

for i in range(1000000):
    exec(open("dv core ohne fatumknoten.py").read())
Edit: Das Problem war ja, dass ich, wenn ich das Kernprogramm in eine Schleife gesetzt hab, immer ähnliche Werte rausbekommen habe. irgendein Fehler mit dem Zufallsgenerator also. Nun habe ich ein zweites Programm erstellt, dass das erste n mal aufruft - dabei stimmen die Werte.

Edit 2: Ich habe es gerade nochmal probiert, es geht doch ^^. Bei dem alten Programm hat also generell irgendwas wohl nicht so ganz gestimmt.
BlackJack

@qEagleStrikerp: Nur weil etwas funktioniert eignet es sich nicht automatisch. Man kann auch Nägel mit dem Griff eines Schraubendrehers in die Wand kloppen, das macht den Schraubendreher aber nicht zum richtigen Werkzeug für diese Aufgabe.
qEagleStrikerp
User
Beiträge: 21
Registriert: Sonntag 14. September 2014, 09:42

BlackJack hat geschrieben:@qEagleStrikerp: Nur weil etwas funktioniert eignet es sich nicht automatisch. Man kann auch Nägel mit dem Griff eines Schraubendrehers in die Wand kloppen, das macht den Schraubendreher aber nicht zum richtigen Werkzeug für diese Aufgabe.
^^ Da hast du natürlich vollkommen recht. Wie ich ja nachträglich noch geschrieben habe, funktioniert das Programm ja auch mit Schleife, was exec überflüssig macht.
Antworten