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

Samstag 19. April 2008, 13:53

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

Samstag 19. April 2008, 22:28

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 19. April 2008, 22:33

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

Samstag 19. April 2008, 23:03

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 19. April 2008, 23:45

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

Sonntag 20. April 2008, 10:05

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.)
lunar

Sonntag 20. April 2008, 10:37

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.)
Nicht nur das, du hast auch noch die Paradigmen der wahren, der einzigartigen funktionalen Programmierung verletzt. ;)

In der funktionalen Programmierung dürfen Funktionen prinzipbedingt keine Seiteneffekte haben, denn in der Mathematik sind Funktionen ja auch nebeneffektsfrei.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Sonntag 20. April 2008, 11:42

Tipp: Haskell lernen mit einer Aufgabe, die nach Zufallszahlen verlangt, kann einen als Einsteiger wahnsinnig machen ;)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 20. April 2008, 14:03

lunar hat geschrieben:Nicht nur das, du hast auch noch die Paradigmen der wahren, der einzigartigen funktionalen Programmierung verletzt. ;)
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.

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 Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 21. April 2008, 10:56

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,

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 21. April 2008, 13:03

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 Modvoice
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 21. April 2008, 13:14

Meine unendlich vielen Affen an Schreibmaschinen bei mir im Keller haben schon eine besser Lösung geschrieben, ich muss sie nur mal eben raussuchen...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 21. April 2008, 13:25

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...
Liegt gleich neben den Werken von Shakespeare.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 21. April 2008, 13:38

Leonidas hat geschrieben:Und wie sinvoll es ist ``max`` zu überschreiben, darf sich jeder selbst denken.
Ups, da hast du recht ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Montag 21. April 2008, 22:12

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