Hallo,
ich habe da ein kleines Problem.
Wir sollen in der Schule ein Programm schreiben, welches Zufallszahlen zwischen 1 und 49 erzuegt (also so zu sagen ein "Lottoprogramm"). Wie jeder weiß, können dabei Zahlen nicht zweimal gezogen werden. Und genau hier liegt das Problem. Wie bekommt man es hin, dass der Zufallszahlengenerator eine gezogene Zahl nicht noch einmal zieht?
Zufallszahlen nicht doppelt vorkommen
... alle bereits gezogenen Zahlen in eine Liste schreiben. Und jede neue Ziehung mit der Liste vergleichen.
Aber das ist vielleicht ein bisschen umständlich ...
Aber das ist vielleicht ein bisschen umständlich ...
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hallo Pille0503, willkommen im Forum,
Indem man die bereits gezogenen Zahlen aus der Liste die man ``random.choice()`` übergibt vorher entfernt.Pille0503 hat geschrieben:Wie bekommt man es hin, dass der Zufallszahlengenerator eine gezogene Zahl nicht noch einmal zieht?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
das gefällt mirJan-Peer hat geschrieben:Kreativwettbewerb? Man könnte auch so lange zufällige Zahlen aus einer mit range(1,50) erzeugten Liste entfernen, bis nur noch sechs Zahlen übrig sind
Ich biete dann diese Variante.jens hat geschrieben:lasst uns doch mal alle Varianten zusammentragen und mit timeit messen, die langsamste Variante hat gewonnen
Mit etwas Glück schafft man es damit unter 10 Sekunden ...
Code: Alles auswählen
from random import random
numbers = []
while len(numbers)<6:
n = 0
while random()>.000001:
n += 1
n = n % 49 + 1
numbers = [] if n in numbers else numbers+[n]
print numbers
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Grad durch Auslastung können sie nicht in einen Modus mit geringerem Takt schalten um Strom zu sparenSr4l hat geschrieben:sonst wären die unnötig und CO2 Sünder.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Code: Alles auswählen
import random
pool = range(1, 50)
def ziehen(numbers=[]):
chosen = random.choice(pool)
numbers.append(chosen)
pool.remove(chosen)
if len(numbers) < 7:
ziehen(numbers)
return numbers
print ziehen()
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nö, Extrapunkte gibts nur für Endrekursiondennda hat geschrieben:Für die Rekursion gibts bestimmt Extrapunkte.
Aber mutable Defaultargumente in Funktionen sind keine besonders tolle Idee, denn die Liste wird nur einmal erstellt und so bleiben die dort gespiecherten Items "hängen".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Stimmt.
Code: Alles auswählen
import random
pool = range(1, 50)
def ziehen(numbers):
chosen = random.choice(pool)
numbers.append(chosen)
pool.remove(chosen)
if len(numbers) < 7:
ziehen(numbers)
return numbers
print ziehen([])
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Dann meckere ich gleich mal weiter, denn die Rekursion ist zwar aus funktionaler Sicht klasse, jedoch veränderst du ``pool``, wodurch ``ziehen`` nicht Seiteneffektfrei ist *nitpick*.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice