Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 14 Mathematik
  Pfeil 14.1 Mathematische Funktionen – math, cmath
  Pfeil 14.2 Zufallszahlengenerator – random
  Pfeil 14.3 Präzise Dezimalzahlen – decimal
    Pfeil 14.3.1 Verwendung des Datentyps
    Pfeil 14.3.2 Nichtnumerische Werte
    Pfeil 14.3.3 Das Context-Objekt


Galileo Computing - Zum Seitenanfang

14.2 Zufallszahlengenerator – random  topZur vorigen Überschrift

Das Modul random der Standardbibliothek erzeugt Pseudozufallszahlen und bietet zudem einige zusätzliche Funktionen, um zufallsgesteuerte Operationen auf Basisdatentypen anzuwenden.

Beachten Sie, dass das Modul random keine echten Zufallszahlen erzeugen kann, sondern sogenannte Pseudozufallszahlen. Echte Zufallszahlen sind für einen Computer nicht berechenbar. Ein Generator für Pseudozufallszahlen wird mit einer ganzen Zahl initialisiert und erzeugt aufgrund dieser Basis eine deterministische, aber scheinbar zufällige Abfolge von Pseudozufallszahlen. Diese Zahlenfolge wiederholt sich dabei nach einer gewissen Anzahl von erzeugten Zufallszahlen. Im Falle des in Python standardmäßig verwendeten Algorithmus beträgt diese Periode 219937  – 1 Zahlen.

Bevor Sie die Beispiele dieses Abschnitts ausprobieren können, müssen Sie selbstverständlich das Modul random einbinden:

>>> import random

Steuerungsfunktionen

random.seed([x])

Initialisiert den Zufallszahlengenerator mit der Instanz x. Wenn es sich bei x um eine ganze Zahl handelt, wird der Zufallszahlengenerator direkt mit dieser Zahl, ansonsten mit dem Hash-Wert der übergebenen Instanz initialisiert.

Wenn kein Parameter übergeben wird, wird der Zufallszahlengenerator mit der aktuellen Systemzeit initialisiert. Auf diese Weise können die erzeugten Zahlen als quasi-zufällig angesehen werden.

Wenn der Zufallszahlengenerator zu unterschiedlichen Zeiten mit demselben Wert initialisiert wird, erzeugt er jeweils dieselbe Zahlenfolge.

random.getstate()

Die Funktion getstate gibt ein Tupel zurück, das den aktuellen Status des Zufallszahlengenerators beschreibt. Mithilfe der Funktion setstate lässt sich damit der Status des Generators speichern und zu einem späteren Zeitpunkt, beispielsweise nach zwischenzeitlicher Neuinitialisierung, wiederherstellen.

random.setstate()

Die Funktion setstate akzeptiert ein von getstate erzeugtes Tupel und überführt den Zufallszahlengenerator in den durch dieses Tupel beschriebenen Status.

>>> state = random.getstate() 
>>> random.setstate(state)
random.jumpahead(n)

Ändert den Initialisierungszustand des Zufallszahlengenerators. Die ganze Zahl n wird dazu verwendet, den internen Zustand zu durchmischen. Beachten Sie, dass jumpahead auf einem deterministischen Algorithmus basiert, dass also ein Aufruf von jumpahead aus dem gleichen internen Zustand heraus und mit dem gleichen Parameter n immer zu dem gleichen neuen internen Zustand des Zufallszahlengenerators führen wird.

>>> random.seed(1234) 
>>> random.jumpahead(567)
random.getrandbits(k)

Erzeugt eine ganze Zahl, deren Bitfolge aus k zufälligen Bits besteht. Das Ergebnis ist, unabhängig von der verwendeten Bitzahl, immer eine Instanz des Datentyps long.

>>> random.getrandbits(8) 
149L 
>>> random.getrandbits(8) 
187L

Funktionen für ganze Zahlen

random.randrange([start, ]stop[, step])

Gibt ein zufällig gewähltes Element der Liste zurück, die ein Aufruf der Built-in Function range mit gleichen Parametern erzeugen würde. Das heißt, es wird eine Zufallszahl n zwischen start und stop erzeugt, für die gilt: start + n · step.

>>> random.randrange(0, 50, 2) 
40
random.randint(a, b)

Erzeugt eine zufällige, ganze Zahl n, sodass gilt: anb.

>>> random.randint(0, 10) 
2 
>>> random.randint(0, 10) 
7

Funktionen für Sequenzen

random.choice(seq)

Gibt ein zufällig gewähltes Element der Sequenz seq zurück. Die übergebene Sequenz darf nicht leer sein.

>>> random.choice([1,2,3,4,5]) 
5 
>>> random.choice([1,2,3,4,5]) 
2

Im Beispiel wurde der Einfachheit halber eine Liste mit ausschließlich numerischen Elementen verwendet. Dies muss nicht unbedingt sein, es darf ein beliebiger sequenzieller Datentyp mit beliebigen Elementen übergeben werden.

random.shuffle(x[, random])

Die Funktion shuffle bringt die Elemente der Sequenz x in eine zufällige Reihenfolge. Beachten Sie, dass diese Funktion nicht seiteneffektfrei ist, sondern die übergebene Sequenz an sich bearbeitet wird. Aus diesem Grund dürfen für x auch nur Instanzen veränderlicher sequenzieller Datentypen übergeben werden.

Als optionaler Parameter random kann ein Funktionsobjekt übergeben werden, das über die gleiche Schnittstelle verfügt wie die Funktion random.random, die später beschrieben wird. Durch Implementieren einer solchen Funktion ist es möglich, shuffle einen eigenen Zufallszahlengenerator vorzugeben.

>>> l = [1,2,3,4] 
>>> random.shuffle(l) 
>>> l 
[1, 4, 3, 2]
random.sample(population, k)

Die Funktion sample bekommt eine Sequenz population und eine ganze Zahl k als Parameter übergeben. Das Ergebnis ist eine neue Liste mit k zufällig gewählten Elementen aus population. Auf diese Weise könnte beispielsweise eine gewisse Anzahl von Gewinnern aus einer Liste von Lotterieteilnehmern gezogen werden. Beachten Sie, dass auch die Reihenfolge der erzeugten Liste zufällig ist und die Ziehungen bei mehrmaligem Funktionsaufruf mit Wiederholungen durchgeführt werden.

>>> pop = [1,2,3,4,5,6,7,8,9,10] 
>>> random.sample(pop, 3) 
[7, 8, 5] 
>>> random.sample(pop, 3) 
[5, 9, 7]

Die Funktion sample kann insbesondere auch in Kombination mit der Built-in Function xrange verwendet werden:

>>> random.sample(xrange(10000000), 3) 
[4571575, 2648561, 2009814]

Spezielle Verteilungen

random.random()

Gibt die nächste Zufallszahl zurück. Der Rückgabewert ist eine Gleitkommazahl zwischen 0.0 und 1.0.

>>> random.random() 
0.067300272273646655 
>>> random.random() 
0.52544342703734148
random.uniform(a, b)

Erzeugt eine gleichverteilte zufällige Gleitkommazahl n, sodass gilt: a n < b.

>>> random.uniform(0.5, 0.6) 
0.5618673220051662
random.betavariate(alpha, beta)

Erzeugt Zufallszahlen, die statistisch der Betaverteilung entsprechen. Die Parameter alpha und beta müssen numerische Werte größer als -1 sein, und der Rückgabewert liegt zwischen 0 und 1.

>>> random.betavariate(2.5, 1.0) 
0.76494009914551264
random.expovariate(lambd)

Erzeugt Zufallszahlen, die statistisch der Exponentialverteilung entsprechen. Der Parameter lambd ist 1.0 geteilt durch das gewünschte arithmetische Mittel. Der Rückgabewert liegt zwischen 0 und positiv unendlich.

>>> random.expovariate(0.5) 
0.85259287178065613
random.gammavariate(alpha, beta)

Erzeugt Zufallszahlen, die statistisch der Gammaverteilung entsprechen. Die Parameter alpha und beta müssen numerische Werte größer als 0 sein.

>>> random.gammavariate(1.3, 0.5) 
1.1608977325106138
random.gauss(mu, sigma)

Erzeugt Zufallszahlen, die statistisch der Gaußverteilung entsprechen. Der Parameter mu entspricht dem arithmetischen Mittel und sigma der Standardabweichung.

>>> random.gauss(0.5, 1.9) 
1.0084579933596225
random.lognormvariate(mu, sigma)

Erzeugt Zufallszahlen, die statistisch der logarithmischen Normalverteilung entsprechen. Der Parameter mu entspricht dem arithmetischen Mittel und sigma der Standardabweichung.

>>> random.lognormvariate(0.5, 1.9) 
0.25625006871810202
random.normalvariate(mu, sigma)

Erzeugt Zufallszahlen, die statistisch der Normal- oder Gaußverteilung entsprechen. Der Parameter mu entspricht dem arithmetischen Mittel und sigma der Standardabweichung. Die Funktion ist damit äquivalent zu gauss.

>>> random.normalvariate(0.5, 1.9) 
1.9176550196262139
random.vonmisesvariate(mu, kappa)

Erzeugt Zufallszahlen, die statistisch der von-Mises-Verteilung entsprechen. Der Parameter mu entspricht dem mittleren Winkel in Radiant und kappa dem Konzentrationsparameter, der größer oder gleich 0 sein muss.

>>> random.vonmisesvariate(0.5, 1.9) 
2.0502913847498458
random.paretovariate(alpha)

Erzeugt Zufallszahlen, die statistisch der Pareto-Verteilung entsprechen.

>>> random.paretovariate(0.5) 
43.528372368738189
random.weibullvariate(alpha, beta)

Erzeugt Zufallszahlen, die statistisch der Weibull-Verteilung entsprechen.

>>> random.weibullvariate(0.5, 1.9) 
0.23610339261628124

Alternative Generatoren

random.SystemRandom([seed])

Das Modul random enthält zusätzlich zu den oben erläuterten Funktionen eine Klasse namens SystemRandom, die es ermöglicht, den Zufallszahlengenerator des Betriebssystems zu verwenden statt den Python-eigenen. Beachten Sie, dass diese Klasse nicht auf allen, aber auf den gängigsten Betriebssystemen existiert.

Beim Instanziieren der Klasse kann eine Zahl oder Instanz zur Initialisierung des Zufallszahlengenerators übergeben werden. Danach kann die Klasse SystemRandom wie das Modul random verwendet werden, da sie die meisten im Modul enthaltenen Funktionen als Methode implementiert.

Beachten Sie jedoch, dass nicht die komplette Funktionalität von random in SystemRandom zur Verfügung steht. So werden Aufrufe der Methoden seed und jumpahead ignoriert, während Aufrufe der Methoden getstate und setstate eine NotImplementedError-Exception werfen.

>>> sr = random.SystemRandom() 
>>> sr.randint(1, 10) 
9


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de