Zufallszahlen nicht doppelt vorkommen

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.
Pille0503
User
Beiträge: 2
Registriert: Donnerstag 17. April 2008, 13:36

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?
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

... alle bereits gezogenen Zahlen in eine Liste schreiben. Und jede neue Ziehung mit der Liste vergleichen.

Aber das ist vielleicht ein bisschen umständlich ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo Pille0503, willkommen im Forum,
Pille0503 hat geschrieben:Wie bekommt man es hin, dass der Zufallszahlengenerator eine gezogene Zahl nicht noch einmal zieht?
Indem man die bereits gezogenen Zahlen aus der Liste die man ``random.choice()`` übergibt vorher entfernt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

oder [mod]random#random.shuffle[/mod] verwenden ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

oder random.sample ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

oder so lange Zufallszahlen zu einem set hinzufügen, bis 6 Elemente drin sind ...
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

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 :roll: :lol:
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Jan-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 :roll: :lol:
:D das gefällt mir :P
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

lasst uns doch mal alle Varianten zusammentragen und mit timeit messen, die langsamste Variante hat gewonnen ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

... und der Gewinner darf dann bei den Hausaufgaben helfen. :twisted:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

jens hat geschrieben:lasst uns doch mal alle Varianten zusammentragen und mit timeit messen, die langsamste Variante hat gewonnen ;)
Ich biete dann diese Variante.
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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:die langsamste Variante hat gewonnen ;)
Warum gerade die?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

...nur so ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Leonidas hat geschrieben:
jens hat geschrieben:die langsamste Variante hat gewonnen ;)
Warum gerade die?
Weil moderne CPUs ausgelastet werden müssen, sonst wären die unnötig und CO2 Sünder.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sr4l hat geschrieben:sonst wären die unnötig und CO2 Sünder.
Grad durch Auslastung können sie nicht in einen Modus mit geringerem Takt schalten um Strom zu sparen :P
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Pille0503
User
Beiträge: 2
Registriert: Donnerstag 17. April 2008, 13:36

Danke für die Hilfe. Werde alles mal ausprobieren. :D :D
Benutzeravatar
dennda
User
Beiträge: 17
Registriert: Montag 19. November 2007, 22:07

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()
Für die Rekursion gibts bestimmt Extrapunkte. :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

dennda hat geschrieben:Für die Rekursion gibts bestimmt Extrapunkte. :)
Nö, Extrapunkte gibts nur für Endrekursion :P

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
Benutzeravatar
dennda
User
Beiträge: 17
Registriert: Montag 19. November 2007, 22:07

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([])
Leonidas
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
Antworten