Zum Forum springen
Simulationsprogramm...
 
Benachrichtigungen
Alles löschen

[Geschlossen] Simulationsprogramm [5$ inside]

38 Beiträge
9 Benutzer
0 Reactions
2,550 Ansichten

Ich suche ein Programm, mit dem man einfache Simualtionen ausführen kann.

Ich bräuchte dieses Programm um eine statistische Analyse durchführen zu können. Also ich möchte 2 Lotterien über die Zeit vergleichen. Die eine Lotterie hat einen höheren Erwartungswert, ist allerdings risikoreicher. Die andere Lotterie hat einen niedrigeren Erwartungswert, ist dafür aber nicht so risikoreich. Das Ganze muss unter der Nebenbedingung eines Budgets simuliert werden.

Konkret: Lotterie 1: Erfolgswahrscheinlichkeit 0.6 - 3€ Gewinn Verlustwahrscheinlichkeit 0,4 - 3€ Verlust

Lotterie 2: Erfolgswahrscheinlichkeit 0,75 - 5€ Gewinn
Verlustwahrscheinlichkeit 0,25 - 5€ Verlust

Budget: 9€

Ich würde zunächst einmal den restringierten Erwartungswert für Lotterie 1 ersimulieren und danach den Erwartungswert für Lotterie 2 ersimulieren. Das Ganze Ding soll entweder nach 100 Wiederholungen abbrechen oder wenn man broke ist (Budget aufgebraucht)!

Für eine gescheite Idee und ein passendes Simulationsprogramm, welches soetwas errechnen kann shippe ich 5$ auf Stars!

Freu mich über jede konstruktive Anregung!


37 Antworten
sarc
Beigetreten: 06.06.2008

Wenn du ne beliebige Programmiersprache beherrscht hast das in ungefähr 10 Minuten selber geschrieben. Wenn nicht kommt noch n Tag dazu, um die Grundzüge einer Scriptsprache zu erlernen... ;)


Programmiersprachen beherrsche ich leider nicht... Für sowas muss es aber doch irgendein vorgefertigtes Simulationstool geben?!


o_O das kannste doch sogar alles analytisch lösen man

für lotterie2 dann halt mit nem effektiven budget von 5€

wie man es löst steht zb umrissen in "the mathematics of poker" beim thema risk of ruin


FiftyBlume
Beigetreten: 06.06.2010

Okay, du willst also einfach nur 100x beide Varianten durchspielen lassen?

Ich kann dir in n paar Minuten n programm dafür schreiben, aber ohne oberfläche udn so scheiß...und du bräuchtest n Compiler:)


o_O das kannste doch sogar alles analytisch lösen man für lotterie2 dann halt mit nem effektiven budget von 5€ wie man es löst steht zb umrissen in "the mathematics of poker" beim thema risk of ruin

Ich weiss wie man es analytisch lösen kann, allerdings muss ich es simulieren.

Okay, du willst also einfach nur 100x beide Varianten durchspielen lassen? Ich kann dir in n paar Minuten n programm dafür schreiben, aber ohne oberfläche udn so scheiß...und du bräuchtest n Compiler

Danke erstmal für dein Angebot. Was ich brauche ist folgendes: Ich möchte diesen sogenannten stochastischen Bernoulliprozess simulieren. Dabei muss ich variabel eingeben, was mein p ist und was mein n ist. P steht für die Erfolgswahrscheinlichkeit und 1-p dann für die Verlustwahrscheinlichkeit. n steht für die Anzahl der Wiederholungen. Darüber hinaus müssen die Auszahlungen für Erfolg/Verlust variabel sein. Wenn ein variables Budget B unterschritten wird, dann muss die Simulation abbrechen und das Ergebniss ist 0. So das wären die Bedingungen an den stochastischen Prozess. Nun soll dieser stochastische Prozess m mal durchgeführt werden und die die Ergebnisse für jeden Prozess irgendwo abgelegt werden. Aus den Ergebnissen soll dann für eine große Anzahl Wiederholungen m der Mittelwert errechnet werden, der der Schätzer des Erwartungswertes des stochastischen Prozesses sein soll!

Beispiel:

Lotterie 1: Erfolgswahrscheinlichkeit p=0.6, n=100 Wiederholungen der Lotterie, Budget=10, Auszahlung bei Erfolg=10, Auszahlung bei Misserfolg=-10

Lotterie 2: Erfolgswahrscheinlichkeit p=0.6, n=100 Wiederholungen der Lotterie, Budget=10, Auszahlung bei Erfolg=10, Auszahlung bei Misserfolg=-10

So: Lotterie 1 hat für sich genommen einen höheren Erwartungswert (E(X1)=2), allerdings ist die Wahrscheinlichkeit broke zu gehen sehr viel höher (p1(broke)=2/3). Lotterie 2 hat für sich genommen einen geringeren Erwartungswert (E(X2)=1), allerdings ist die Wahrscheinlichkeit broke zu gehen lediglich p2(broke)=4/15. Das Problem lässt sich analytisch lösen und es ergibt, dass es sinnvoller ist Lotterie 2 zu bevorzugen, weil der stochastische Prozess einen höheren EV aufweist als Lotterie 2. D.h., dass obwohl die einzelnen wiederholten unabh. Spiele der Lotterie 1 höher zu bewerten sind, ist der gesamte Prozess schlechter zu bewerten.

Ähm ja das ist doch wohl relativ umständlich Erhöhe somit auf [10$] für ein brauchbares tool. Vielleicht gibt es ja sowas auch im Inet, das wäre auch schon ok!


sarc
Beigetreten: 06.06.2008

Lol, Aufwand... Du hast wirklich noch nie programmiert... ;)

Kommst du irgendwie an Matlab ran? Dann tipp ich dir das schnell runter... Wenn nicht darf das gern FiftyBlume machen, kein Bock das mit ner compilierten Sprache zu machen... ;)


verstehe die Aufgabe immer noch nicht so wirklich. Würde das sonst gerne machen.


FiftyBlume
Beigetreten: 06.06.2010

Original von bergi88
verstehe die Aufgabe immer noch nicht so wirklich. Würde das sonst gerne machen.

Ist doch ganz klar....ich geh mal davon aus du kannst programmieren;)

er braucht ne schleife, die 100x durchläuft und zufällig bestimmt ob man gewinnt und verliert.

Dabei soll p(win), Budget, Gewinnsumme/Verlustsumme frei wählbar sein.


Original von FiftyBlume

Original von bergi88
verstehe die Aufgabe immer noch nicht so wirklich. Würde das sonst gerne machen.

Ist doch ganz klar....ich geh mal davon aus du kannst programmieren;)

er braucht ne schleife, die 100x durchläuft und zufällig bestimmt ob man gewinnt und verliert.

Dabei soll p(win), Budget, Gewinnsumme/Verlustsumme frei wählbar sein.

hm glaube nicht, dass es zufällig sein soll. Du hast ja Wahrscheinlichkeiten gegeben und musst ja die Varianz einarbeiten.
Das muss ihrgendwie über die Bestimmung des asymptotischen Konfidenzintervalles laufen. Aus diesem Intervall muss dann vllt. eine Wert zufällig gewählt werden und damit dann über die Binominalverteilung die Wahrscheinlichkeit ausrechenn zu gewinnen oder zu verlieren oder so ähnlich. Mit ner einfachen Schleife ist das sicherlich nicht getan.


Lol, Aufwand... Du hast wirklich noch nie programmiert... Augenzwinkern Kommst du irgendwie an Matlab ran? Dann tipp ich dir das schnell runter... Wenn nicht darf das gern FiftyBlume machen, kein Bock das mit ner compilierten Sprache zu machen... Augenzwinkern

Jau an Matlab dürfte ich rankommen. Bedenke aber bitte, dass ich die Wiederholungen n (inerhalb eines stoch.Prozesses) variabel brauche, die Wahrscheinlichkeit p variabel brauche, das Budget B variabel brauche und die Anzahl der Wiederholungen m der stoch. Prozesse variabel brauche. Es ist wichtig, dass ich die Mittelwerte der einzelnen m stochastischen Prozesse (welcher in sich nochmal n Wiederholungen hat) aufaddieren kann und daraus wiederrum nochmal den Mittelwert ziehen kann, um für m gegen unendlichen mit dem Mittelwert einen guten Schätzer für den Erwartungswert des stoch. Prozesses zu bekommen!

Hier ist im Übrigen auch nen Ansatz zur Implementierung von Bernoulliprozessen in Matlab, vllt hilft dir das ja auch!

http://halweb.uc3m.es/esp/Personal/personas/amalonso/esp/Matlab_Tutorial_PartII_2005.pdf


hm habe was programmiert. werde eben noch die Benutzereingaben reinkloppen und dann mal uppen.


Tobiwanknobi
Beigetreten: 11.06.2008

So hier ist es. Funktioniert wie folgt: Parameter eingeben und es erfolgt die Berechnung und Ausgabe am Schirm (kann auch in Datei ausgegebn werden muss ich dann aber erst programmieren)

interner Ablauf:

es wird zuerst das Asymptotische Konfidenzintervall (95%) bestimmt. Diese wird auf die vorgegeben Wahrscheinlichkeit addiert und abgezogen. Wenn es addiert wird hat man die Wahrscheinlichkeit die man maximal erreicht kann. Wenn es subtrahiert wird erhält man die minimal Wahrscheinlchkeit. Mit steigenden Durchläufen werden die Schwankungen (Konfidenzintervall wird immer kleiner) immer kleiner. Wir nähern uns immer weiter unserer Schätzung an

Ausgabe:
Anzahl der Durchgänge | Kapital_minimal | Kapital_maximal | Asymptotische Konfidenzintervall | min Wahrscheinlichkeit zu gewinnen | max Wahrscheinlichkeit zu gewinnen
Lotterie_110201.exe - 29.3 Kb


sarc
Beigetreten: 06.06.2008

Hm... Könntest du nem Statistik-Noob wie mir erklären, warum das so kompliziert sein muss? Die einzelnen "Lottoziehungen" haben doch einfach ne fixe Wahrscheinlichkeit, und gut ist. Warum sollte ich da künstlich noch ein Intervall einführen, in dem die Wahrscheinlichkeit liegt? Damit seh ich das schon so, dass sich das einfach mit zwei Schleifen lösen lässt. Dazu kommt halt nur noch, dass man aufhört, wenn man broke ist. Wobei sich die Frage stellt, ob broke für B < 0 oder für B <= 0 vorliegt. Wobei man, wenn mans genau macht, broke ist, wenn man den Einsatz nicht mehr zahlen kann.

Wie auch immer, ich hab dir hier mal den Code in Matlab, so wie ich die Aufgabe verstanden hab (sprich: ziemlich stumpf). Parameter sollten klar sein.

function res = sim_lotto(p,n,m,B,win,loss)

res = 0;
for im = 1:m
B_akt = B;
for in = 1:n
if rand <= p, B_akt = B_akt + win; else, B_akt = B_akt + loss; end
if B_akt < 0, B_akt = 0; break, end
%if B_akt < abs(loss), break, end
end
res = res + B_akt;
end
res = res / m;

end

Mit der auskommentierten Zeile wird aufgehört, wenn mans ich den nächsten Einsatz nicht mehr leisten kann. Wenn irgendwo Blödsinn drinsteht, sagt Bescheid. (rand <= p sollte stimmen, da rand einen Wert aus (0,1] liefert)


ehrlich gesagt nein . Glaube auch mittlerweile das es falsch ist, aber habe jetzt keine Lust darüber nachzudenken ^^

/*
Lotterie_110201.c
*/

#include <stdio.h>	//für das Programm notwendige Definitionsdateien einbinden
#include <stdlib.h>
#include <math.h>

FILE 	*ausgabe;

void intro(void)
{
    puts("Lotterie Simulation\n01.02.2011\n\n");
}

double Abfrage_Bankroll(void)
{
	double	Bankroll;
	char 	Einlesevariable[32];

	Start_Abfrage_Bankroll:
	puts("Bitte geben Sie den Wert Ihres Startkapitals ein (1 bis 1000)!");
	fgets(Einlesevariable, 32, stdin);
	Bankroll = atof(Einlesevariable);

	if(Bankroll >= 1 && Bankroll <= 1000)
	{
		return Bankroll;
	}
	else
	{
		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
		goto Start_Abfrage_Bankroll;
	};
}


double Abfrage_Lotterie()
{
	double	Wahrscheinlichkeit;
	char 	Einlesevariable[16];

	Start_Abfrage_Lotterie:
	printf("Bitte geben Sie die Gewinnwahrscheinlichkeit fuer ein Los in Prozent an!\n");
	fgets(Einlesevariable, 16, stdin);
	Wahrscheinlichkeit = atof(Einlesevariable);

	if(Wahrscheinlichkeit > 0.001 && Wahrscheinlichkeit <= 100)
	{
		return Wahrscheinlichkeit;
	}
	else
	{
		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
		goto Start_Abfrage_Lotterie;
	};
}

double Abfrage_Preis_Lotterie()
{
    double	Preis_Lotterie;
	char 	Einlesevariable[16];

	Start_Abfrage_Preis_Lotterie:
	printf("Bitte geben Sie den Preis eines Loses an (zwischen 0.001 und 100)!\n");
	fgets(Einlesevariable, 16, stdin);
	Preis_Lotterie = atof(Einlesevariable);

	if(Preis_Lotterie > 0.001 && Preis_Lotterie <= 100)
	{
		return Preis_Lotterie;
	}
	else
	{
		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
		goto Start_Abfrage_Preis_Lotterie;
	};

}

double Abfrage_Gewinn_Lotterie()
{
    double	Gewinn_Lotterie;
	char 	Einlesevariable[16];

	Start_Abfrage_Gewinn_Lotterie:
	printf("Bitte geben Sie den moeglichen Gewinn an (zwischen 0.001 und 100)!\n");
	fgets(Einlesevariable, 16, stdin);
	Gewinn_Lotterie = atof(Einlesevariable);

	if(Gewinn_Lotterie > 0.001 && Gewinn_Lotterie <= 100)
	{
		return Gewinn_Lotterie;
	}
	else
	{
		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
		goto Start_Abfrage_Gewinn_Lotterie;
	};

}


double Abfrage_Anzahl_Simulationsvorgaenge(void)
{
	int	Anzahl_Simulationsvorgaenge;
	char 	Einlesevariable[64];

	Start_Abfrage_Anzahl_Simulationsvorgaenge:
	puts("Bitte geben Sie die Anzahl Ihrer Simulationsvorgaenge an (1 bis 10000)!\n");
	fgets(Einlesevariable, 64, stdin);
	Anzahl_Simulationsvorgaenge = atoi(Einlesevariable);

	if(Anzahl_Simulationsvorgaenge > 1 && Anzahl_Simulationsvorgaenge <= 10000)
	{
		return Anzahl_Simulationsvorgaenge;
	}
	else
	{
		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
		goto Start_Abfrage_Anzahl_Simulationsvorgaenge;
	};
}

void Ausgabe_Parameter(double Bankroll,double p_Lotterie, double Preis_Lotterie, double Gewinn_Lotterie, int Anzahl_Simulationen)
{
    system("cls");
    printf("Die Simulation wird mit folgenden von Ihnen gewaehlten Parametern ausgefuehrt!\n");
    printf("Bankroll:\t%5.2lf\n", Bankroll);
    printf("Wahrscheinlichkeit:\t%2.2lf\n", p_Lotterie);
    printf("Preis pro Los:\t%4.2lf\n", Preis_Lotterie);
    printf("Gewinn pro Los:\t%4.2lf\n", Gewinn_Lotterie);
    printf("Durchgaenge:\t%d\n", Anzahl_Simulationen);
    system("PAUSE");
}
double Berechnung_Intervall(double p, int i)
{
    double  Intervall   = 0;

    Intervall = 1.65*sqrt((p*(1-p))/i);
    return Intervall;
}


double Berechnung_Bankroll(double Bankroll, double p, double Preis, double Gewinn)
{
    if (p > 0 && p <= 1)
    {
        Bankroll = Bankroll - Preis + (p*Gewinn);
        return Bankroll;
    }
    if (p > 1)
    {
        Bankroll = Bankroll - Preis + Gewinn;
        return Bankroll;
    }
    if (p <= 0)
    {
        Bankroll = Bankroll - Preis;
        return Bankroll;
    }

}


void Ausgabe_Daten(int Durchlauf, double Bankroll_konservativ, double Bankroll_optimal, double Intervallgrenze, double p_konservativ, double p_optimal)
{
    printf("%d\t%5.2lf\t%5.2lf\t%2.2lf\t%2.2lf\t%2.2lf\t\n",  Durchlauf, Bankroll_konservativ, Bankroll_optimal, Intervallgrenze, p_konservativ, p_optimal);
//    fprintf(ausgabe, "%d\t%5.2lf\t%5.2lf\t%2.2lf\t%2.2lf\t%2.2lf\t\n",  Durchlauf, Bankroll_konservativ, Bankroll_optimal, Intervallgrenze, p_konservativ, p_optimal);
}


void Simulation(double Bankroll, double p_Lotterie, double Preis, double Gewinn, int Anzahl_Simulationen)
{
    double  Intervallgrenze = 0,
            Bankroll_konservativ    = 0,
            Bankroll_optimal        = 0,
            p_konservativ   = 0,
            p_optimal       = 0;
    int     i   = 1;

    Bankroll_konservativ = Bankroll;
    Bankroll_optimal = Bankroll;
    char dateiname[] = "ausgabe.dat";
	ausgabe = fopen(dateiname, "w");
    do
    {
        Intervallgrenze = Berechnung_Intervall(p_Lotterie, i);
        p_konservativ = p_Lotterie - Intervallgrenze;
        p_optimal = p_Lotterie + Intervallgrenze;
        Bankroll_konservativ    = Berechnung_Bankroll(Bankroll_konservativ, p_konservativ, Preis, Gewinn);
        Bankroll_optimal        = Berechnung_Bankroll(Bankroll_optimal, p_optimal, Preis, Gewinn);
        Ausgabe_Daten(i, Bankroll_konservativ, Bankroll_optimal, Intervallgrenze, p_konservativ, p_optimal);
        i = i++;
    }
    while (i < (Anzahl_Simulationen+1));
    fclose(ausgabe);
}


int main(void)
{
    double  Bankroll            = 0,
            p_Lotterie          = 0,
            Preis_Lotterie      = 0,
            Gewinn_Lotterie     = 0;
    int    Anzahl_Simulationen  = 1000;

    intro();
    Bankroll = Abfrage_Bankroll();
    p_Lotterie = Abfrage_Lotterie();
    Preis_Lotterie = Abfrage_Preis_Lotterie();
    Gewinn_Lotterie = Abfrage_Gewinn_Lotterie();
    Anzahl_Simulationen = Abfrage_Anzahl_Simulationsvorgaenge();
    Ausgabe_Parameter(Bankroll,p_Lotterie, Preis_Lotterie, Gewinn_Lotterie, Anzahl_Simulationen);
    Simulation(Bankroll, p_Lotterie / 100, Preis_Lotterie, Gewinn_Lotterie, Anzahl_Simulationen);
    system("PAUSE");
    return 0;
}

Hier mal mein Quellcode


sarc
Beigetreten: 06.06.2008

Und darum nutz ich für so was nur noch Scriptsprachen... ;)


. Habe leider kein MatLab zu Hause.


sarc
Beigetreten: 06.06.2008

Hab mir kurz überlegt, das in Perl zu tippen...

Aber da is die Wahrscheinlichkeit auch eher gering, dass ers ausführen kann, und noch viel geringer, dass er kleine Modifikationen ausprobiert...

Kann aber wie gesagt nur empfehlen, ne Scriptsprache zu lernen, falls man öfter mal solche Sachen braucht. Matlab ist für Numerik gut geeignet, auch wenn ich die Sprache hässlich find. Ansonsten würd ich als Allrounder Python empfehlen. (Und btw: Es gibt mit Octave nen freien Matlab-Clon, der für kleine Programme gar nicht mal so schlecht ist.)


Wow hier ist viel passiert, werde mir gleich mal eure Tools ansehen! Melde mich dann wieder...

broke ist, wenn B<=0 ist!