Seite 1 von 1
Zählen der while-Schleifen Durchgänge
Verfasst: Montag 22. April 2013, 16:06
von SpyHRO65
Moin,
ich muss für die Uni ein Programm schreiben welches zwei Würfel simuliert, die so lange geworfen werden sollen bis sie einen Pasch erzeugt haben. Ist bis da hin auch kein Problem, nun soll ich aber am Ende des Programms ausgeben wie viele Versuche ich gebraucht habt bzw. wie oft die Schleife durchgelaufen ist. Wie das geht weiß ich leider nicht. Habe auch schon ne Weile gegoogelt, aber nix ordentliches dazu gefunden. Wäre top, wenn mir Jemand weiterhelfen könnte.
Bisher sieht meine Code so aus:
Code: Alles auswählen
import random
würfel1 = 0
würfel2 = 1
while würfel1 != würfel2:
würfel1 = random.randint(1,6)
würfel2 = random.randint(1,6)
print(würfel1, würfel2)
if würfel1 == würfel2:
print('Sie haben einen', würfel1,'-er Pasch gewürfelt')
Re: Zählen der while-Schleifen Durchgänge
Verfasst: Montag 22. April 2013, 16:30
von BlackJack
@SpyHRO65: Arbeite mal das Tutorial in der Python-Dokumentation durch, oder ein anderes geeignetes Grundlagentutorial. Für komplette Programmieranfänger wird
Learn Python The Hard Way oft empfohlen.
Danach solltest Du wissen wie das geht. Im Grunde fehlt Dir nur noch die Rechenoperation ``+``, alles andere was man dazu braucht kennst Du ganz offensichtlich schon. Vielleicht noch die ``break``-Anweisung, damit man nach dem Pasch auch tatsächlich aufhören kann zu würfeln.
Re: Zählen der while-Schleifen Durchgänge
Verfasst: Montag 22. April 2013, 16:37
von SpyHRO65
@BlackJack
Danke Dir. ich werde es mir mal zu Gemüte führen

Re: Zählen der while-Schleifen Durchgänge
Verfasst: Montag 22. April 2013, 16:49
von SpyHRO65
@BlackJack
Top Sache. Es klappt. was so ein i = i+1 doch so alles bewirken kann^^
Re: Zählen der while-Schleifen Durchgänge
Verfasst: Montag 22. April 2013, 17:23
von /me
SpyHRO65 hat geschrieben:was so ein i = i+1 doch so alles bewirken kann^^
Oder
i += 1
Re: Zählen der while-Schleifen Durchgänge
Verfasst: Montag 22. April 2013, 20:42
von Sirius3
Wer zählt denn hier selber, man läßt doch mit itertools.count zählen.
Re: Zählen der while-Schleifen Durchgänge
Verfasst: Montag 22. April 2013, 21:39
von BlackJack
Ich würde ja `sum()` verwenden:
Code: Alles auswählen
from itertools import imap, takewhile
from operator import ne
from random import randint
def dice_rolls():
while True:
yield randint(1, 6)
def main():
print sum(1 for _ in takewhile(bool, imap(ne, dice_rolls(), dice_rolls())))
if __name__ == '__main__':
main()

Re: Zählen der while-Schleifen Durchgänge
Verfasst: Montag 22. April 2013, 23:38
von xeike
Meine Lösung ist zwar nicht schön, aber ich komme ohne while-Schleife aus:
Code: Alles auswählen
def wuerfel():
dummy_liste = [1]
with open('/dev/random', 'rb') as zufall:
for dummy in dummy_liste:
wurf1, wurf2 = zufall.read(2)
print(wurf1, wurf2)
dummy_liste.append(1)
if wurf1 == wurf2:
break
print( len(dummy_liste) )
Da ist es leicht, bis 0 zu zählen.
(Nur ein Spaß)
Xe
Re: Zählen der while-Schleifen Durchgänge
Verfasst: Dienstag 23. April 2013, 00:05
von BlackJack
@xeike: Ein Würfel mit 256 Seiten dürfte andere Ergebnisse liefern als einer mit 6 Seiten. Und wenn es nur darum geht kein ``while`` zu verwenden, dann ersetze in meiner Lösung die `dice_rolls()`-Funktion einfach durch diese hier:
Code: Alles auswählen
def dice_rolls():
return iter(partial(randint, 1, 6), None)
Mit `partial()` aus dem `functools`-Modul.

Re: Zählen der while-Schleifen Durchgänge
Verfasst: Dienstag 23. April 2013, 00:16
von xeike
BlackJack hat geschrieben:@xeike: Ein Würfel mit 256 Seiten dürfte andere Ergebnisse liefern als einer mit 6 Seiten. Und wenn es nur darum geht kein ``while`` zu verwenden, dann ersetze in meiner Lösung die `dice_rolls()`-Funktion einfach durch diese hier:
Na, geht doch
Auf das Anpassen an das Intervall 1..6 habe ich verzichtet, das war jetzt zu billig bei der sonst schon sehr langen Lösung...
Functools kenne ich noch nicht.
N8,
Xe
Re: Zählen der while-Schleifen Durchgänge
Verfasst: Dienstag 23. April 2013, 07:13
von Sirius3
@BlackJack: jetzt seh ich Dich schon innerhalb von wenigen Tagen zum zweiten Mal die zweiparametrige Form von »iter« benutzen, die ich vorher noch nicht kannte

.
Mußte ich jetzt auch gleich anwenden:
Code: Alles auswählen
# coding: utf-8
import random
class DiceCompare:
def __init__(self):
self.found = False
def __eq__(self, dices):
result = self.found
self.found = all(dice==dices[0] for dice in dices)
return result
class ManyDiceRoller:
def __init__(self, count=2, sides=range(1,6)):
self.count = count
self.sides = sides
def __call__(self):
return tuple(map(random.choice, [self.sides]*self.count))
def main():
result = list(iter(ManyDiceRoller(3,u"⚀⚁⚂⚃⚄⚅"), DiceCompare()))
print("Es wurden {} Wuerfe gebraucht und zwar:\n{}".format(len(result),
'\n'.join(map(''.join, result))))
if __name__=='__main__':
main()