2016-05-05 3 views
-5

Ich beziehe mich auf Shuffle-Funktion Python zufällige Module.Zufälligkeit von Shuffle in Python

from random import shuffle 

list = [1, 2, 3, 4] 

shuffle(list) 

Ich würde vermuten, dass obige Funktion zufällige Samen verwendet. Ich weiß, dass in C Rand-Funktion über einige zufällige Seed-Nummern im Computer iteriert. Daher wird beim zufälligen Durchlaufen der Funktion die Zufallsfunktion nicht mehr zufällig.

Funktioniert die Shuffle-Funktion ähnlich wie die Rand-Funktion in C? Wenn ja, wie kann ich meinen eigenen Samen hinzufügen, der zufällig ist? (Ich denke daran, die Zeit in Millisekunden zu verwenden, um einen einzigartigen Wert zu erzielen).

geschrieben zuvor Kommentar über die akzeptierte Antwort auf diese Frage könnte aber bekommen keine Antwort (Shuffling a list of objects in python)

EDIT:

ich sicherstellen möchten, dass zufällige Shuffle nicht seine schlurfenden nicht wiederholen Methode in einer Schleife . Zum Beispiel

Ich mag mische [1, 2, 3, 4, 5, 6]

I Schleife über 10000 mal.

Es produziert Ergebnisse unter: [1, 3, 2, 4, 5, 6] [2, 1, 4, 5, 3, 6] ... (große Anzahl von unterschiedlichen Kombinationen von shuffling) [1, 3, 2, 4, 5, 6] [2, 1, 4, 5, 3, 6] ... (wiederholt das Muster).

Ich möchte das obige Verhalten vermeiden, weil ich über eine große Anzahl von Schleifen bin. Würde das oben genannte Verhalten überhaupt passieren? Wenn ja, muss ich den Seed nach einer bestimmten Anzahl von Schleifen ändern?

+2

Was meinst du mit „iteriert über ein paar Zufallsstartnummern in Computer“? Fragen Sie, ob die Ausgabe deterministisch ist? Fragst du, ob es "wirklich" zufällig oder nur pseudozufällig ist? – BrenBarn

+2

Ich habe Ihren Kommentar beantwortet, aber diese Frage zeigt einen Mangel an Forschungsaufwand (also die Downvotes) - das genaue Verhalten ist im ['random' Modul] (https://docs.python.org/3/library) eindeutig dokumentiert /random.html). – dimo414

+1

Ihre Nachfolgefrage wird auch in der Dokumentation beantwortet; Das 'Zufallsmodul '* hat eine Periode von 2 \ * \ * 19937-1 *", was bedeutet, dass es nach diesen vielen Schritten eine identische Folge von Werten ausgeben wird. Falls es nicht klar ist, das ist eine ** riesige ** Nummer. Für alle praktischen Zwecke (außer Kryptographie) ist es nicht von wahrer Zufälligkeit zu unterscheiden. – dimo414

Antwort

2

Fast alle Modulfunktionen hängen von der Grundfunktion random(), die gleichmäßig einen zufälligen Schwimmers erzeugt in dem halboffenen Intervall [0,0, 1,0). Python verwendet den Mersenne Twister als Kerngenerator. Es produziert 53-Bit-Präzisionsschwimmer und hat eine Periode von 2 ** 19937-1. Die zugrunde liegende Implementierung in C ist sowohl schnell als auch threadsafe. Der Mersenne Twister ist einer der am ausführlichsten getesteten Zufallszahlengeneratoren in Existenz. Da es jedoch vollständig deterministisch ist, ist es für alle Zwecke nicht geeignet und ist für kryptografische Zwecke völlig ungeeignet.

Der Zufall Modul bietet auch die SystemRandom Klasse, die die Systemfunktion os.urandom() verwendet, Zufallszahl aus Quellen vom Betriebssystem zur Verfügung gestellt zu erzeugen.

Warnung Die Pseudozufallsgeneratoren dieses Moduls sollten aus Sicherheitsgründen nicht verwendet werden. Verwenden Sie os.urandom() oder SystemRandom, wenn Sie einen kryptografisch sicheren Pseudozufallszahlengenerator benötigen.

3

Ich weiß, dass in C, rand Funktion wird über ein paar zufälligen Samen Zahlen in Computer.

Nein, tut es nicht. Es verwendet den von Ihnen festgelegten Startwert mit srand, oder 1, wenn Sie srand nicht aufgerufen haben.

Funktioniert die Shuffle-Funktion ähnlich wie die Rand-Funktion in C? Wenn ja, wie kann ich meinen eigenen Samen hinzufügen, der zufällig ist? (Ich denke daran, die Zeit in Millisekunden zu verwenden, um einen einzigartigen Wert zu erzielen).

Python's random module uses either system time or OS-provided randomness sources to seed the RNG:

random.seed([x]) 

die Basiszufallszahlen-Generator initialisieren. Optionales Argument x kann irgendein hashbares Objekt sein. Wenn x weggelassen oder None, aktuelle Systemzeit verwendet wird; Die aktuelle Systemzeit wird auch zum Initialisieren des Generators verwendet, wenn das Modul zum ersten Mal importiert wird. Wenn Zufälligkeit Quellen vom Betriebssystem zur Verfügung gestellt werden, werden sie anstelle der Systemzeit (siehe die os.urandom() Funktion Einzelheiten zur Verfügbarkeit) verwendet.

In Version 2.4 geändert: früher Betriebssystemressourcen wurden nicht verwendet.