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

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

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

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

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 (former) Modvoice
Benutzeravatar
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,

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@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. :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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. :-)
Wir brauchen dringend ``inf`` :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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 !

Code: Alles auswählen

stelle = range(8)
print stelle
random.shuffle(stelle)
print stelle
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

sea-live: Warum hast du dann ``random.sample(items, length)`` nicht gefunden? :) Damit kannst du Listen mit einmalig vorkommenden Items aus Quellen erstellen, die auch größer als die Liste sein können.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sample und shuffle wurden ja auch bereits auf der ersten Seite genannt.
Antworten