Zählen der while-Schleifen Durchgänge

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
SpyHRO65
User
Beiträge: 8
Registriert: Montag 22. April 2013, 15:59

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')
Zuletzt geändert von Anonymous am Montag 22. April 2013, 16:22, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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.
SpyHRO65
User
Beiträge: 8
Registriert: Montag 22. April 2013, 15:59

@BlackJack

Danke Dir. ich werde es mir mal zu Gemüte führen :)
SpyHRO65
User
Beiträge: 8
Registriert: Montag 22. April 2013, 15:59

@BlackJack

Top Sache. Es klappt. was so ein i = i+1 doch so alles bewirken kann^^
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

SpyHRO65 hat geschrieben:was so ein i = i+1 doch so alles bewirken kann^^
Oder i += 1
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

Wer zählt denn hier selber, man läßt doch mit itertools.count zählen.
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()
:-)
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

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. :wink:

(Nur ein Spaß)

Xe
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. :-)
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

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
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@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 :D .
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()
Antworten