Seite 1 von 1

Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 18:09
von programmierneuling
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

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 18:23
von EyDu
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

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 19:07
von programmierneuling
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?

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 19:26
von schorsch
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.

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 20:31
von numerix
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])

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 21:52
von programmierneuling
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"

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 22:25
von numerix
programmierneuling hat geschrieben:was ist der Unterschied zwischen "randint" und "randrange"
http://docs.python.org/py3k/library/random.html

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 23:09
von derdon
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.

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 23:16
von numerix
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

Re: Gleichverteilte Zufallszahlen plotten

Verfasst: Mittwoch 24. November 2010, 23:24
von derdon
Jo, hab die Diskussion schon fast vergessen. Hat Spaß gemacht, sie noch einmal zu lesen :)