Angenommen, ich habe die folgende Liste:
foo = ['a', 'b', 'c', 'd', 'e']
Was ist der einfachste Weg, um ein Element zufällig aus dieser Liste abzurufen?
Verwenden random.choice()
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Für kryptografisch sichere zufällige Auswahlmöglichkeiten (z. B. zum Generieren einer Passphrase aus einer Wortliste) verwendensecrets.choice()
import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))
secrets
ist neu in Python 3.6, in älteren Versionen von Python können Sie die random.SystemRandom
Klasse verwenden:
import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
random.choice(foo)
zwei unterschiedliche Ergebnisse?random.sample(lst, n)
Standard pseudo-random generators are not suitable for security/cryptographic purposes.
refWenn Sie mehr als ein Element zufällig aus einer Liste auswählen oder ein Element aus einem Satz auswählen möchten, würde ich empfehlen,
random.sample
stattdessen zu verwenden.Wenn Sie jedoch nur ein einzelnes Element aus einer Liste ziehen, ist die Auswahl weniger umständlich, da die Verwendung von sample die Syntax
random.sample(some_list, 1)[0]
anstelle von verwenden würderandom.choice(some_list)
.Leider funktioniert die Auswahl nur für eine einzelne Ausgabe von Sequenzen (wie Listen oder Tupeln). Dies
random.choice(tuple(some_set))
kann jedoch eine Option sein, um einen einzelnen Artikel aus einem Set zu erhalten.BEARBEITEN: Verwenden von Geheimnissen
Wie viele bereits betont haben, sollten Sie das Modul "Geheimnisse" verwenden, wenn Sie sicherere Pseudozufallsstichproben benötigen:
EDIT: Pythonic One-Liner
Wenn Sie einen pythonischeren Einzeiler für die Auswahl mehrerer Elemente wünschen, können Sie das Auspacken verwenden.
quelle
secrets
Modul wurde der Python-Standardbibliothek in Version 3.6 hinzugefügt. Python.org/dev/peps/pep-0506Wenn Sie auch den Index benötigen, verwenden Sie
random.randrange
quelle
Ab Python 3.6 können Sie das
secrets
Modul verwenden, das demrandom
Modul für Kryptografie- oder Sicherheitszwecke vorzuziehen ist .So drucken Sie ein zufälliges Element aus einer Liste:
So drucken Sie einen zufälligen Index:
Einzelheiten finden Sie in PEP 506 .
quelle
Ich schlage ein Skript vor, um zufällig ausgewählte Elemente von einer Liste zu entfernen, bis sie leer sind:
Pflegen Sie ein
set
und entfernen Sie zufällig aufgenommenes Element (mitchoice
), bis die Liste leer ist.Drei Läufe geben drei verschiedene Antworten:
quelle
random.shuffle
dielist
einmal und entweder Iterierte es oder Pop es Ergebnisse zu produzieren. Beides würde zu einem vollkommen adäquaten Stream "Zufällig ohne Wiederholungen auswählen" führen, nur dass die Zufälligkeit am Anfang eingeführt würde.In Python 2:
In Python 3:
quelle
random.choices
mit Ersatz, währendrandom.sample
ohne Ersatz ist.numpy
Lösung:numpy.random.choice
Für diese Frage funktioniert sie genauso wie die akzeptierte Antwort (
import random; random.choice()
), aber ich habe sie hinzugefügt, da der Programmierer möglicherweise bereits importiert hatnumpy
(wie ich) und es auch einige Unterschiede zwischen den beiden Methoden gibt , die Ihren tatsächlichen Anwendungsfall betreffen können.Für die Reproduzierbarkeit können Sie Folgendes tun:
Übergeben Sie für Beispiele eines oder mehrerer Elemente , die als zurückgegeben werden
array
, das folgendesize
Argument:quelle
Wenn Sie nahezu zufällig sein möchten , empfehle ich
secrets.choice
aus der Standardbibliothek (Neu in Python 3.6.):Das Obige entspricht meiner früheren Empfehlung, ein
SystemRandom
Objekt aus demrandom
Modul mit derchoice
Methode zu verwenden - früher in Python 2 verfügbar:Und nun:
Wenn Sie eine deterministische Pseudozufallsauswahl wünschen, verwenden Sie die
choice
Funktion (die eigentlich eine gebundene Methode für einRandom
Objekt ist):Es scheint zufällig zu sein, aber es ist tatsächlich nicht so, was wir sehen können, wenn wir es wiederholt neu aussäen:
Ein Kommentar:
Ja, Sie können ein "Seed" -Argument übergeben, aber Sie werden sehen, dass das
SystemRandom
Objekt es einfach ignoriert :quelle
Wenn Sie den Index benötigen, verwenden Sie einfach:
random.choice macht das gleiche :)
quelle
random.choice(self, seq)
isreturn seq[int(self.random() * len(seq))]
.randrange()
bedeutet, dass zrandom.SystemRandom().randrange(3<<51)
. B. eine signifikante Verzerrung vorliegt. Seufz ...float
(ein IEEE-Double) nur eine endliche Anzahl von Werten in [0,1] annehmen kann.Random.random()
generiert seine Ausgabe auf herkömmliche Weise: Wählen Sie eine zufällige Ganzzahl aus[0, 2**53)
und dividieren Sie durch2**53
(53 ist die Anzahl der Bits in einem Doppel). Es werden alsorandom()
2 ** 53 gleichwahrscheinliche Doppelte zurückgegeben, und Sie können dies nur dann gleichmäßig in N Ausgänge aufteilen, wenn N eine Potenz von 2 ist. Die Vorspannung ist für kleine N klein, aber siehecollections.Counter(random.SystemRandom().randrange(3<<51)%6 for i in range(100000)).most_common()
. (Javas Random.nextInt () vermeidet solche Verzerrungen.)2**40
(das ist 1099511627776) wäre klein genug, damit die Tendenz in der Praxis keine Rolle spielt? Dies sollte in der Dokumentation unbedingt erwähnt werden, da jemand, der nicht genau ist, möglicherweise keine Probleme mit diesem Teil seines Codes erwartet.random
Anwendungen ,getrandbits
um eine ausreichende Anzahl von Bits zu erhalten , um ein Ergebnis für eine größere zu erzeugenrandrange
s (random.choice
ist auch mit, dass). Dies gilt sowohl für 2.7 als auch für 3.5. Es wird nur verwendet,self.random() * len(seq)
wenngetrandbits
es nicht verfügbar ist. Es macht nicht das Dumme, was du denkst.Dies ist der Code mit einer Variablen, die den Zufallsindex definiert:
Dies ist der Code ohne die Variable:
Und dies ist der Code auf kürzeste und intelligenteste Weise:
(Python 2.7)
quelle
Der folgende Code zeigt, ob Sie dieselben Artikel produzieren müssen. Sie können auch angeben, wie viele Samples Sie extrahieren möchten.
Die
sample
Methode gibt eine neue Liste mit Elementen aus der Grundgesamtheit zurück, während die ursprüngliche Grundgesamtheit unverändert bleibt. Die resultierende Liste befindet sich in Auswahlreihenfolge, sodass alle Unterschnitte auch gültige Zufallsstichproben sind.quelle
Zufällige Artikelauswahl:
Um die Reihenfolge der Liste beizubehalten, können Sie Folgendes tun:
Duplikat von https://stackoverflow.com/a/49682832/4383027
quelle
Wir können dies auch mit Randint tun.
quelle
random.choice()
und gibtrandom.randrange()
?None
die Dose zurückgeben, wird die Dose an einen zufälligen späteren Punkt verschoben, an dem das ungültige "Element" eine Ausnahme auslöst. oder noch schlimmer, Sie erhalten ein falsches Programm anstelle einer Ausnahme, und Sie wissen es nicht einmal.Sie könnten einfach:
quelle