Random Walk C++

Status
Für weitere Antworten geschlossen.

lachi457

Cadet 3rd Year
Registriert
Sep. 2013
Beiträge
46
Hey Leute,

ich sitze gerade an einer Aufgabe, in der ich einen 1-dim. Random Walk simulieren soll,sprich jmd. startet bei x=0 und hat dann die gleiche Wahrscheinlichkeit für einen Schritt nach links und einen nach rechts. Dann gibt es noch eine Besonderheit - bei x=10 ist eine "Falle", wer da reintritt kommt nur mit Wahrscheinlichkeit 1-p wieder raus, mit Wahrscheinlichkeit p startet ein neuer Läufer. Wenn der wieder in die Falle tappt startet entweder wieder ein neuer oder ein alter geht aus der Falle raus usw...Ich soll das dann simulieren für Lange Zeiten und feste p.
Habe mir da schon ein paar Sachen einfallen lassen,ist jetzt nicht das gelbe vom Ei, auf jeden Fall besteht mein Problem eigentlich zentral bei den Zufallszahlen.
Ich habe im Code die Random Funktion von C++ genutzt, das ist mir eigentlich zu einfach. Im Skript hat unser Professor auf http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html verwiesen, solange einem das andere zu "simpel" ist. Das ist dann allerdings wieder zu kompliziert für dieses Problem. Kann man irgendwie einfache Zufallszahlen erzeugen? Wir kennen noch die R250 Methode und den linear kongruenten Zufallsgenerator, welcher aber beide nicht für die praktische Anwendung empfohlen werden.
Ein weiteres Problem besteht bei der Wahrscheinlichkeit die Falle wieder zu verlassen. Die Wahrscheinlichkeit habe ich durch ein Intervall in den Zufallszahlen simuliert, hierbei ist die 0% WK allerdings immer mit inbegriffen, natürlich fällt die bei hohen Zufallsintervallen fast raus,allerdings nicht gänzlich. Gibt es dabei eine Lösung?

Hier mein "bis jetzt" Code

#include <iostream>
#include <math.h>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <vector>

using namespace std;

int
main ()

{

int N = 10000;

srand (time (NULL));

vector < int >S (N);

int L = 0;

int G = 0;

int counter = 0;

double p = 50*(1000); //Damit der Prozentsatz konform mit der Modulorechnung ist

ofstream A;
A.open ("Zahlen.dat");

for (int i = 0; i < N; i++)
{
int x = rand () % 100001;//Hohe Modulorechnung damit die 0 selten getroffen wird
if (x <= 50000)
{

S = 1;
}
else
{
S = -1;
}

L += S;

if (L == 10)
{
if (x<=p)
{
L = 0;
counter++;
}
else
{
S = S;
}
}
else
{
S = S;
}

G = sqrt( L * L);

cout << G << " " << counter << " " << L << endl;


A << G << " " << counter << " " << L << endl;

}

}


Grüße lachi457
 
Zuletzt bearbeitet von einem Moderator: (Beitrag wiederhergestellt)
Generell:
Es gibt hier tags mit denen du deinen Code markieren solltest, damit man ihn lesen kann
[ code ] ... [ /code ]

Bevor du über "bessere" Zufallszahlen nachdenkst: Programmier unbedingt deinen Algorithmus erstmal fehlerfrei! Ich habe ihn nicht durchgesehen aber dein Text oben ließt sich so, als ob du dir garnicht sicher bist ob der immer 100% korrekt arbeitet.

Die nächste Frage: C++11 oder der alte Standard? Gerade durch C++11 ist es im Bereich Zufallszahlen sehr sehr angenehm geworden:
http://www.cplusplus.com/reference/random/
Die erwähnten "Mersenne twister" ist eine der zur Verfügung stehenden "Pseudo-random number engines". Die Beispiele auf cplusplus.com sind so einfach, dass es sich kaum lohnt sie hier her zu kopieren. Oder verstehe ich das falsch? Oben ließt es sich so, als wäre der Kern der Aufgabe der RandomWalk. Oder geht es um die eigene Implementierung eines Zufallszahlenalgos?
Wie auch immer: Lagere das Problem unbedingt in eine Funktion/Klasse aus, wenn du nicht die komfortable C++11 Bibliothek benutzt. Das Erzeugen der Zufallszahlen sollte unabhängig von der Random-Walk Implementierung sein.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben