Gleichverteilte Zufallszahlen plotten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
programmierneuling
User
Beiträge: 3
Registriert: Mittwoch 24. November 2010, 15:18

Hallo,
ein wort zu mir, hab vor 3-4wochen nicht mal gewusst was programmieren ist, bin daher ein richtiger newbie wenns um programmieren geht.

was ich gerne machen würde, ist die überprüfung eines zufallsgenerators auf seine Gleichverteilung.
beispielsweise die Zufallszahlen die von " random.randint() " erzeugt wurden, diese auf ihre gleichverteilung prüfen im rahmen des statistischen fehlers.
ich habs mir so vorgestellt das ich eine tabelle mit x y erzeuge, wobei x die durchnummerierung der minimalen und maximalen zufallszahl als ganzzahl sein soll(also für random.randint(1, 100), währen x = {1, 2, 3, ..., 99, 100}).
y sind dann die anzahl der erzeugten zufallszahlen (zB für 1000 zufällig erzeugten zahlen für y(1)=10, y(2)=9, y(3)=10 usw. [im idealfall wäre das so, im der realität würde das deutlicher streuen])
mit der x y tabelle kann man dann in origin plotten, fehlerwert berechen usw.

hab zwar ein ansatz mit dem ich das hinkriege, aber anstatt wie im beispiel zufallszahlen zwischen 1 und 100 zu erzeugen brauch ich zufallszahlen zwischen 1 und 10000, mit meinem bescheiden phyton wissen würde das auch zu einen viel zu langen code führen ...

Code: Alles auswählen

from random import randint
i = 0
q = 50
l1 = []
l2 = []
l3 = []
l4 = []
l5 = []
while(i < q):
    x = randint(1, 5)
    if x == 1:
        l1.append(x)
    elif x == 2:
        l2.append(x)
    elif x == 3:
        l3.append(x)
    elif x == 4:
        l4.append(x)
    elif x == 5:
        l5.append(x)
    i = i + 1
l = [len(l1), len(l2), len(l3), len(l4), len(l5)]
L = list(range(1, q))
print("x", "y")
for J,j in zip(L, l):
    print(J, j)
so hätte ich es für 100 verschiedene zahlen gemacht, aber wie man sieht bei 10000 zahlen ist das etwas umständing :|

was ich noch gerne wissen würde, wäre der befehl, dass das resultat direkt in eine txt-datei gespeichert wird

wäre super wenn mir einer helfen kann (kanns mir schon vorstellen das es eine total simple sache ist, aber bin halt noch ein frischling)

Gruß
Martin
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Wenn du anfängst Namen zu nummerieren, dann möchtest du Listen, Tupel oder Dictionaries verwenden.

Und noch ein paar Hinweise:
- statt while solltest du hier for benutzen, da du die Anzahl der Schleifendurchläufe bereits kennst.
- du solltest richtige Namen verwenden. "q", "l1" und "j" sagen nicht aus
- die Klammern beim while solltest du dir sparen
- die ganzen "elif"s kann du mit einem Dictionary besser lösen
- das list bei "list(range(...))" ist unnötig
- "range(1, q)" liefert dir wahrscheinlich nicht das, was du erwartest
- und in "l" möchtest du wahrscheinlich auch mehr als fünf Elemente haben.

Sebastian
Das Leben ist wie ein Tennisball.
programmierneuling
User
Beiträge: 3
Registriert: Mittwoch 24. November 2010, 15:18

EyDu hat geschrieben: - die ganzen "elif"s kann du mit einem Dictionary besser lösen
Sebastian
hi Sebastian,
danke für die schnelle Antwort, kannst du mehr zu den Dictionary sagen?
schorsch
User
Beiträge: 18
Registriert: Montag 26. November 2007, 18:39

Du könntest die ganzen durchnummerierten Listen durch eine einzelne Liste ersetzen, die die anderen Listen als Elemente enthält (eigentlich das gleiche was EyDu schon angesprochen hat). Dann kannst du, anstatt mit if zu überprüfen in welche liste die Zahl gehört, die erzeugte Zahl gleich als Index benutzen.

Interessiert dich eigentlich nur die Anzahl der jeweils erzeugten Zufallszahlen? Dann solltest du evtl. statt Listen einfach Integer verwenden und bei jedem 'Treffer' den Wert um 1 erhöhen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Hier mal ein Stückchen Code zum Experimentieren und Drübernachdenken (gedacht für Python 3.x):

Code: Alles auswählen

from random import randrange

rmax = 100
n = 10000
anz = [0]*rmax
for r in range(n):
    anz[randrange(rmax)] += 1
for r in range(rmax):
    print(r,anz[r])
programmierneuling
User
Beiträge: 3
Registriert: Mittwoch 24. November 2010, 15:18

schorsch hat geschrieben:Du könntest die ganzen durchnummerierten Listen durch eine einzelne Liste ersetzen, die die anderen Listen als Elemente enthält (eigentlich das gleiche was EyDu schon angesprochen hat). Dann kannst du, anstatt mit if zu überprüfen in welche liste die Zahl gehört, die erzeugte Zahl gleich als Index benutzen.

Interessiert dich eigentlich nur die Anzahl der jeweils erzeugten Zufallszahlen? Dann solltest du evtl. statt Listen einfach Integer verwenden und bei jedem 'Treffer' den Wert um 1 erhöhen.
ja mich interessiert nur die Anzahl der Zufallszahlen, wenn ich das plotte und den statischen Fehler als Fehlerbalken rein nehme sehe ich, ob der Zufallsgenerator gleichverteilt ist oder nicht (was ja mein Ziel ist)
numerix hat geschrieben:Hier mal ein Stückchen Code zum Experimentieren und Drübernachdenken (gedacht für Python 3.x):

Code: Alles auswählen

from random import randrange

rmax = 100
n = 10000
anz = [0]*rmax
for r in range(n):
    anz[randrange(rmax)] += 1
for r in range(rmax):
    print(r,anz[r])
was soll ich dazu sagen, genau

Code: Alles auswählen

for r in range(n):
    anz[randrange(rmax)] += 1
dieser Befehl ist es, denn ich bis eben nicht kannte aber gebraucht habe,
dickes Dankeschön

noch ne Frage, wieso geht das nicht mit "randint" befehl? was ist der Unterschied zwischen "randint" und "randrange"
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

programmierneuling hat geschrieben:was ist der Unterschied zwischen "randint" und "randrange"
http://docs.python.org/py3k/library/random.html
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Auszug aus random.py: http://paste.pocoo.org/show/295684/

Wenn es dir auf Geschwindigkeit ankommt, ist randrange also schneller, weil randint ein komfortable spezialfall von randrange ist. Ansonsten das lesbare bevorzugen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

derdon hat geschrieben:Wenn es dir auf Geschwindigkeit ankommt, ist randrange also schneller, weil randint ein komfortable spezialfall von randrange ist. Ansonsten das lesbare bevorzugen.
randrange vs. randint hatten wir schonmal: http://www.python-forum.de/viewtopic.php?f=1&t=19078
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Jo, hab die Diskussion schon fast vergessen. Hat Spaß gemacht, sie noch einmal zu lesen :)
Antworten