Python Zufallszahlen ohne Wiederholung?
Hi,
gibt es einen weg sich Zufallszahlen ohne Wiederholung ausgeben zu lassen? Ich will ein Array (Liste - wie auch immer das heißt ;) ) mit nicht wiederholenden Zahlen. Dabei habe ich selber einen Algorithmus erntwickelt aber der funktioniert noch nicht:
import random
import time
num = [None]*10
num2 = [None]*10
rand = 0
for i in range(len(num)):
rand = random.randrange(1, 20)
num2[i] = rand
num[i] = rand
if rand in num2:
while rand in num2:
#if rand in num2:
rand = random.randrange(1, 20)
num[i] = rand
num.sort()
for i in range(len(num)):
print(num[i])
print('\n'+str(time.perf_counter()))
Das ist mein bisheriger Quellcode.
Das if Statement hab ich erst grade hinzugefügt um zu sehen welchen Einfluss es hat...
3 Antworten
Mach's einfach so:
- Füge alle ziehbaren Zahlen (1-20) in eine Liste
- Shuffle die Liste (dann sind die 20 Zahlen zufällig vermischt)
- Nimm die ersten 10 Werte der Liste
Dann hast du 10 Zufallszahlen ohne Wiederholung.
Stimmt so kann man das machen.... Ich hab jetzt selber nochmal nachgedacht und eine Lösung gefunden... Hab mit ner for Schleife durch die Liste 'geloopt' und mit ner while Schleife so lang geloopt bis ne Zahl kommt die nicht in der Liste ist...
Unnötig kompliziert, invertiere einfach Deine Logik:
Erzeuge ien Liste mit den Zahlen 1-20 (Bereich aus dem die Zufalszahlen stammen sollen) und ziehe dann 10 mal zufällig aus dieser Liste.
random.choice() ist hier ein Helferlein.
Noch einfacher:
Nimm Deine Liste mit den Werten von 1-20, führe ein Shuffle aus und nehem die ersten 10 Werte.
Ich lege einen drauf:
random.sample(range(1,21),10)
Wenn es auch noch schnell sein soll :-D.
Ich habe jetzt nicht den ganzen Code gelesen, kannst aber einfach einen check machen nachdem die Zahl zu der Liste von Zahlen geadded wurde ob sie dort drinnen ist:
if zahl in zahlen:
# do it again oder so
Das klappt nur gut, wenn du wenige Zahlen (r) aus einer signifikant größeren Zahlenmenge (1..N) ziehen willst, ansonsten schlägt die Prüfung zu oft fehl.
Wenn r > N ist, terminiert das nicht mehr.
Kann man ja anpassen ist ja nur ganz grob, also man kann natürlich auch beim random generieren einfach immer aus einer Liste machen zB range und dort dann einfach immer die zahlen entfernen und dann halt statt randint choice nutzen
Einfach meine Antwort kopiert xD