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
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)