Zufallszahlen nicht doppelt vorkommen
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
Ja, ich hab noch etwas Freiraum für eine make_me_a_millionaire_by_cheating()-Funktion gelassen. Vielleicht setzt das mal ein Verantwortlicher so um und ich werd reich!
(An den Fragesteller: Was hier kritisiert wird ist, dass bei Parallelisierung jemand anders pool verändern könnte und damit z.B. nur noch 5 Zahlen drinlassen könnte. Besser wäre es hier aus einem unveränderten pool der immer die Zahlen 1-49 beinhaltet zu ziehen und zu schauen ob die Zahl schon vorkommt oder nicht.)
(An den Fragesteller: Was hier kritisiert wird ist, dass bei Parallelisierung jemand anders pool verändern könnte und damit z.B. nur noch 5 Zahlen drinlassen könnte. Besser wäre es hier aus einem unveränderten pool der immer die Zahlen 1-49 beinhaltet zu ziehen und zu schauen ob die Zahl schon vorkommt oder nicht.)
Nicht nur das, du hast auch noch die Paradigmen der wahren, der einzigartigen funktionalen Programmierung verletzt.dennda hat geschrieben:(An den Fragesteller: Was hier kritisiert wird ist, dass bei Parallelisierung jemand anders pool verändern könnte und damit z.B. nur noch 5 Zahlen drinlassen könnte. Besser wäre es hier aus einem unveränderten pool der immer die Zahlen 1-49 beinhaltet zu ziehen und zu schauen ob die Zahl schon vorkommt oder nicht.)
In der funktionalen Programmierung dürfen Funktionen prinzipbedingt keine Seiteneffekte haben, denn in der Mathematik sind Funktionen ja auch nebeneffektsfrei.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Naja, ich tät ja nichts sagen wenn es schwer wäre das Seiteneffektfrei hinzubekommen. Einige Dinge sind ohne Seiteneffekte recht hart und erfordern starkes umdenken.lunar hat geschrieben:Nicht nur das, du hast auch noch die Paradigmen der wahren, der einzigartigen funktionalen Programmierung verletzt.
Edit: Ich habe mal eine seiteneffektfreie Lösung in Scheme geschrieben. Da ich aber nicht gut Scheme beherrsche (es fehlt mir etwa eine übersicht, welche Funktionen es gibt) ist die entsprechend fürchterlich. So habe ich ``list-rec`` selbst implementiert gehabt, ``cond`` als ``if`` zu missbrauchen ist auch nicht wirklich elegant. Aber so habe ich immer noch was zu optimieren, wäre langweilig wenns optimal wäre. Etwa aus einigen `lambda`s `opt-lambda`s zu machen um optionale Argumente aufzunehmen.
Mein Vorgehen dort ist es eine Liste von 1 bis 49 zu erstellen, eine Zufallszahl zu ziehen und diese dann aus der Liste zu entfernen um dann eine weitere Zahl zu ziehen usw. Natürlich rekursiv. MzScheme stellt ``random`` bereit, bin mir nicht sicher in wie weit das portabel ist.
Edit: Nachgebesserte Version, Scheme kennt ``length`` schon. Ups
Zuletzt geändert von Leonidas am Montag 21. April 2008, 13:02, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Meine Variante ... extra langer code, extra lange Laufzeit
Code: Alles auswählen
import random
class RND(object):
def __init__(self, count, max):
assert count<max, "max must be larger than count!"
self.count = count
self.max = max
self._choosen = []
self.loop_count = 0
def __iter__(self):
return self
def next(self):
if len(self._choosen) >= self.count:
raise StopIteration
while True:
self.loop_count += 1
new_number = random.choice(xrange(1, self.max))
if not new_number in self._choosen:
self._choosen.append(new_number)
return new_number
if __name__ == "__main__":
r = RND(10,11)
print list(r)
print "loop count:", r.loop_count
print "---"
for i in RND(10, 11):
print i,
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Was spricht dagegen ``time.sleep(sys.maxint)`` einzubauen? Und wie sinvoll es ist ``max`` zu überschreiben, darf sich jeder selbst denken.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Liegt gleich neben den Werken von Shakespeare.EyDu hat geschrieben:Meine unendlich vielen Affen an Schreibmaschinen bei mir im Keller haben schon eine besser Lösung geschrieben, ich muss sie nur mal eben raussuchen...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
@Leonidas: Gegen `sys.maxint` spricht, dass es das ab Python 3.0 nicht mehr gibt. Sonst fällt mir kein vernünftiger Grund ein, das nicht einzubauen.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Wir brauchen dringend ``inf``BlackJack hat geschrieben:@Leonidas: Gegen `sys.maxint` spricht, dass es das ab Python 3.0 nicht mehr gibt. Sonst fällt mir kein vernünftiger Grund ein, das nicht einzubauen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gibt es auch ne schnelle variante eine zufällige Liste aus ZB 8 ziffern von 0-7 zuerstellen in der jede ziffer nur 1x vorkommt
war eigentlich ganz einfach nur suchen musste ich !
war eigentlich ganz einfach nur suchen musste ich !
Code: Alles auswählen
stelle = range(8)
print stelle
random.shuffle(stelle)
print stelle