Zufallszahlen ohne Wiederholung (Python)
nun_ja
- programmiertechnik
Bonjour Freunde!
Ich bin auf der Suche nach einem Algorithmus, der mir aus einem Tupel von fortlaufenden Zahlen (zb. 0-999) ohne Wiederholung zufällige Werte liefert.
Um das Problem zu konkretisieren: es geht eigentlich um Objekte in einer Liste - die kann ich dann ja aber mit den entsprechenden Zufallswerten ansprechen.
Ich hab bisher keine in Python eingebaute Funktion gefunden - und meine Funktion läuft viel zu langsam. Ich brauche das ganze für ne Simulation, es sollte also verflucht schnell sein.
liebe Grüße und vielen Dank!
fabian
Hallo nun_ja,
das wird schwierig, da der Zufall ja auch Wiederholungen zulässt. Kann es sein, das du nur ein Array mischen möchtest? Also Array der Länge 1000 mit Zahlen von 0 bis 999 füllen (a[i]=i-1) und dann mischen, Stichwort shuffle.
Gruß, Jürgen
Hey Hey und danke Jürgen!
Gerade mal ausprobiert: leider immernoch viel zu langsam :-(
Um vll doch noch zu erörtern worum es geht: ich programmiere eine Multiagentensimulation. Bei jedem Durchlauf des Systems sollen alle Agenten des Systems in zufälliger Reihenfolge ihr jeweiligen Aktionen durchführen.
Es handelt sich dann unter Umständen um viele tausend Agenten und die Simulation soll potentiell viele tausendmal laufen.
speed matters...
Also vll noch ideen?
liebe Grüße
Fabian
Lieber nun_ja,
dann erstelle doch eine endliche Anzahl an gemischten Arrays (siehe JürgenB), die Du dann der Reihe nach abarbeiten lässt!
Liebe Grüße,
Felix Riesterer.
Ja, hört sich nich dumm an!
vielen dank
Fabian
Hi,
Ich bin auf der Suche nach einem Algorithmus, der mir aus einem Tupel von fortlaufenden Zahlen (zb. 0-999) ohne Wiederholung zufällige Werte liefert.
das Stichwort für die Suche wäre eventuell fisher_yates_shuffle.
Ob es eine fertige Pythonlösung dafür gibt weiß ich nicht.
Adolf
guck ich mir an!
danke!
Was macht denn deine Funktion? Vielleicht könnte man die tunen oder Ideen raus nehmen. Schreib sie doch mal.
Ich sehe schon auch Sinn darin dass du ein Array zufällig mischst und dann der Reihe nach ausliest.
Oder du füllst es mit aufsteigenden Werte und greifst dann zufällig darauf zu. Dann müsstest du dafür sorgen dass ein Wert nur einmal zugegriffen wird. Dazu könntest du dann je nach Zugriff per Zufallszahl einen der ersten (1000 - Zugriffszähler) Einträge auswählen und den aktuellen Eintrag immer so ans Ende des Arrays schieben, dass er beim nächsten Zugriff nicht mehr ausgewählt wird. Schwer zu erklären, wenn du nicht weißt was ich meine, versuch ich es nochmal :-)
Ich bin auf der Suche nach einem Algorithmus, der mir aus einem Tupel von fortlaufenden Zahlen (zb. 0-999) ohne Wiederholung zufällige Werte liefert.
random.randrange gibt sogar eine zufällige Zahl aus einem Intervall zurück, ohne dies zu konstruieren. Wenn man das Intervall und die Liste jeweils anpasst, kann man damit einen Generator basteln, der zufällige Objekte aus einer Liste ausspuckt:
~~~python import random
foo = "eins zwei drei vier fuenf sechs".split()
def random_elements(li):
li = li[:] # Liste kopieren
while li:
index = random.randrange(len(li)) # Zufälliger Index aus dem Intervall
element = li.pop(index) # Element aus der kopierten Liste entfernen
yield element
for el in random_elements(foo):
print el
Eventuell kannst bei Deinem Programm auch auf den [Listen-Kopier-Trick](http://diveintopython3.org/native-datatypes.html#slicinglists) (`li=li[:]`{:.language-python}) verzichten und Speicher sparen.
merci -schau ich mir an!