zufallszahlen, aber nicht zwei gleiche hintereinander

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
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Hallo zusammen,
mit diesem Skript kann ich Zuallszahlen zwischen 0 und 5 erzeugen:

Code: Alles auswählen

#!/usr/bin/env python3
from random import randint
zahlen = [ ]
for i in range(10):
    zufallszahl = randint(0,5)
    zahlen.append(zufallszahl)
for i in zahlen:
    print(i, end=",")
Ein Ergebnis z.B. war:

Code: Alles auswählen

5,0,2,0,3,4,1,1,3,0,
Ich möchte das Skript nun so verändern, dass Wiederholungen zwar grundsätzlich möglich sind, direkte Wiederholungen desselben Wertes (hier z.B. 1,1) möchte ich aber ausschließen.
Ist das überhaupt möglich und wenn ja, wie?
karolus
User
Beiträge: 145
Registriert: Samstag 22. August 2009, 22:34

Code: Alles auswählen

zahlen = [randint(0,5)]
while len(zahlen)<10:
    nextnum = randint(0,5)
    if not zahlen[-1] == nextnum:
        zahlen.append(nextnum)
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Danke, Du hast mir sehr geholfen!
BlackJack

Die ``while``-Schleife passt da irgendwie nicht hin, das würde man eher als ``for``-Schleife ausdrücken. Und ``if not … == …`` wäre als ``if … != …`` IMHO ein wenig direkter und damit einfacher ausgedrückt.

Eine ``while``-Schleife könnte man in einer Lösung mit einer Generatorfunktion verwenden:

Code: Alles auswählen

from itertools import islice
from random import randint


def generate_random_integers(a, b):
    previous = None
    while True:
        result = randint(a, b)
        if result != previous:
            previous = result
            yield result


def main():
    numbers = list(islice(generate_random_integers(0, 5), 10))
    print(', '.join(map(str, numbers)))


if __name__ == '__main__':
    main()
Antworten