Eindimensionaler Random-Walk

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.
Sconine
User
Beiträge: 49
Registriert: Montag 1. Juni 2009, 11:00

Wen ich das grüne wegnehme, dann geht es:

Code: Alles auswählen

import pylab 

from random import random 

def random_steps(n): 
    
 #"""simuliert n Schritte. Zufall entscheidet bei jedem Schritt ob er 
    #Startpunkt hin oder vom Startpunkt weg gemacht wird. 
    #Gibt den Abstand vom Startpunkt zurueck.""" 
    pos = 0 
    for k in xrange(n): 
        pos += 1 if random() > 0.5 else -1
        return pos 

def avg_distance(steps_to_take, repeats): 

    
    """"Ruft random_steps repeats-mal auf, und laesst es jeweils 
    steps_to_take-Schritte simulieren. 
    Funktion gibt dann den Mittelwert der Antworten zurueck""" 

    location_sum = 0 

    for i in xrange(repeats): 
        location_sum += random_steps(steps_to_take) 
    avg_location = location_sum / (repeats * 1.) 
    return avg_location 

if __name__=='__main__': 
    repeats = 20 
    steps_list = range (500) 
    distance_list = [] 
    for steps in steps_list: 
        distance_list.append(avg_distance(steps, repeats)) 

        

pylab.plot(steps_list,distance_list) 
pylab.xlabel('Steps taken') 
pylab.ylabel('Distance from the midpoint') 
pylab.show()  
Aber ich bekomme jetzt die Fehlermeldung:

Code: Alles auswählen

raceback (most recent call last):
  File "C:/Python25/Aufgabenzettel_9/1D_Random.py", line 34, in <module>
    distance_list.append(avg_distance(steps, repeats))
  File "C:/Python25/Aufgabenzettel_9/1D_Random.py", line 25, in avg_distance
    location_sum += random_steps(steps_to_take)
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
Ich habe doch unten gar nix verändert.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Dauer: 9.29385 s
Dauer: 17.31616 s
Dauer: 0.45509 s
Wobei das letzte Python-C ist, hier der Source (bestimmt Vollmist, aber ich kann halt nix C :D):

Code: Alles auswählen

#include "/usr/include/python2.6/Python.h"
#include "stdlib.h"

static PyObject *random_steps(int n) {
    int pos, i;
    pos = 0;

    for(i=0; i<10000000; i++) {
        if(rand()%2) {
            pos++;
        }
        else {
            pos--;
        }
    }

    return Py_BuildValue("i", pos);
}

static PyMethodDef crand_methods[] = {
    {"random_steps", (PyCFunction)random_steps, METH_VARARGS, "C rand"},
    {NULL, NULL}
};

PyMODINIT_FUNC initcrand(void) {
    PyImport_AddModule("crand");
    Py_InitModule("crand", crand_methods);

    srand(time(NULL));
}
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Code: Alles auswählen

import pylab

from random import random

def random_steps(n):
    """simuliert n Schritte. Zufall entscheidet bei jedem Schritt ob er
    Startpunkt hin oder vom Startpunkt weg gemacht wird.
    Gibt den Abstand vom Startpunkt zurueck.
    """
    pos = 0
    for k in xrange(n):
        pos += 1 if random() > 0.5 else -1

    return pos

def avg_distance(steps_to_take, repeats):
    """
    Ruft random_steps repeats-mal auf, und laesst es jeweils
    steps_to_take-Schritte simulieren.
    Funktion gibt dann den Mittelwert der Antworten zurueck
    """

    location_sum = 0

    for i in xrange(repeats):
        location_sum += random_steps(steps_to_take)
    avg_location = location_sum / (repeats * 1.)
    return avg_location

if __name__== '__main__':
    repeats = 20
    steps_list = range (500)
    distance_list = []
    for steps in steps_list:
        distance_list.append(avg_distance(steps, repeats))

       

pylab.plot(steps_list,distance_list)
pylab.xlabel('Steps taken')
pylab.ylabel('Distance from the midpoint')
pylab.show() 
Das 'return pos' war innerhalb der for-Schleife.
So muesste es jetzt funktionieren.

(Sieht toll aus mit pylab.)
:wink:
yipyip
Sconine
User
Beiträge: 49
Registriert: Montag 1. Juni 2009, 11:00

Super, ich bekomme zwar jetzt ein Bild, aber habe immernoch eine Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python25\Aufgabenzettel_9\Random_ich_neu.py", line 34, in <module>
    distance_list.append(avg_distance(steps, repeats))
  File "C:\Python25\Aufgabenzettel_9\Random_ich_neu.py", line 25, in avg_distance
    location_sum += random_steps(steps_to_take)
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'

Kann das nicht einmal ohne irgendwelche Probleme bei mir laufen???
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Wieder irgendwo falsch eingerückt, vermutlich gibt random_steps nichts zurück (also None, welches sich nicht mit einem int zusammenzählen lässt).
Sconine
User
Beiträge: 49
Registriert: Montag 1. Juni 2009, 11:00

Diesen Befehl verstehe ich aber nicht. Ich will doch nur einen Schritt vor oder zurück. Wieso aufeinmal 0.5???

Code: Alles auswählen

for k in xrange(n): 
        pos += 1 if random() > 0.5 else -1 
        return pos 
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Es ist genauso, wie Dauerbaustelle sagt.
In Zeile 15 muss das "return pos" ausserhalb der
for-Schleife sein.
Da Du random_steps auch mit 0 aufrufst, wirst ansonsten
None zurueckgegeben. Schau nochmal in meine letzte Version.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

bist du eigentlich irgendwie im stress? oder machst du dir den nur selbst?
du machst den 36. schritt vor dem 5.
http://www.kinderpornos.info
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Sconine hat geschrieben:Diesen Befehl verstehe ich aber nicht. Ich will doch nur einen Schritt vor oder zurück. Wieso aufeinmal 0.5???

Code: Alles auswählen

for k in xrange(n): 
        pos += 1 if random() > 0.5 else -1 
        return pos 
Da es "mein" Snippet ist: Weißt du, was random() macht?
Wenn nein: Dann schau es doch in der Doku nach.

Weißt du, was ein bedingter Ausdruck ist?
Wenn nein, äh, findet man das in der Doku?

Ok, dann machen wir es mit einer bedingten Anweisung:

Code: Alles auswählen

if random() > 0.5:
    pos += 1
else:
    pos -= 1
Edit: Aber wenn du mit choice() klar kommst: Nimm es!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

yipyip hat geschrieben:Ach so, den Kommentar natuerlich auch um 4 Leerzeichen
einruecken.
Docstring, nicht Kommentar. Die Einrückung von Kommentaren ist unerheblich.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

@birkenfeld:
Hast recht, da war ich in der Terminologie ziemlich schludrig.
:oops:
yipyip
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Sconine hat geschrieben: [...]Überlegen Sie sich eine grafische Darstellung [...].
Dafür hab ich mal einen einfachen Vorschlag:
http://paste.pocoo.org/show/123126/

mit Tkinter und Turtle :D
Antworten