Würfelwahrscheinlichkeiten < Stochastik < Hochschule < Mathe < Vorhilfe
|
Hi!
Ich würde gerne eine Algorithmus finden um die Wahrscheinlichkeit für ein bestimmtes Würfelergebniss zu berechnen. Dabei sind Anzahl der Würfel
und Augenzahl (W6, W20 etc) beliebig.
Leider fällt es mir schwer einen Ansatz zu finden. Allein durch analysieren der Verteilung irgendwie ein Muster zu finden ist mir nicht gelungen. Der Standardansatz Günstige Fälle durch Mögliche Fälle fällt auch flach weil ich keinen generischen Ansatz zum bestimmen der günstigen Fälle habe.
Mein letzter Versuch war zwei einfache Wahrscheinlichkeiten zu berechnen (z.B. Einer-Pasch u.ä.) und durch die zwei Punkte (x = Würfelwert, y = Wahrscheinlichkeit) eine Gaussche Verteilungskurve zu legen.
Dazu müsste man aber y = a * e^(b*x*x) nach a bzw b auflösen was mir schon wieder nicht gelingen will...
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:06 Mo 08.11.2004 | Autor: | Thomie |
Was ist genau dein "Würfelergebnis"?
Interessiert dich also die Summe der Augen oder Auch die Aufteilung?
Sind die Würfel unterscheidbar oder interressieren nur die erscheinenden Zahlen?
Ich denke, diese Informationen dürften für eine Antwort reichen
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:23 Mo 08.11.2004 | Autor: | lithander |
Es interessiert nur die Summe der Augen.
Beispiel: Ich würfel mit 3 sechseitigen Würfeln. Der Algorithmus soll mir nun die Wahrscheinlichkeit nennen eine 12 zu würfeln.
|
|
|
|
|
Hallo lithander,
Die Dichte der Summe 2er Zufallsgrößen ist gleich der Faltung der einzelnen Dichten.
Alles klar?
gruß
mathemaduenn
|
|
|
|
|
Danke, du hast mir schonmal sehr geholfen!
Aber irgendwie bin ich nicht in der Lage das Integral zu lösen. Deshalb itteriere ich im Moment über den Integrationsbereich was natürlich nicht sonderlich schnell ist...
Wie löst man denn y(n) = integral über f(x)*f(n-x)? Was ist da die Stammfunktion? Bin etwas verwirrt....
|
|
|
|
|
Hallo lithander
> Aber irgendwie bin ich nicht in der Lage das Integral zu
> lösen. Deshalb itteriere ich im Moment über den
> Integrationsbereich was natürlich nicht sonderlich schnell
> ist...
>
> Wie löst man denn y(n) = integral über f(x)*f(n-x)? Was ist
> da die Stammfunktion? Bin etwas verwirrt....
Und ich bin verwirrt, wie Du auf Integrale kommst. Augenzahlen von Würfeln sind doch diskrete Zufallsvariablen, deshalb musst Du hier mit (endlichen) Summen rechnen. Hier gleich mit dem Zentralen Grenzwertsatz zu argumentieren, finde ich ziemlich ungenau.
Nehmen wir an, wir haben 2 Würfel, die jeweils mit gleicher Wkt. Zahlen zwischen 1 und 6 produzieren, also [mm] $P(X_1=j,X_2=k)=1/36$ [/mm] für alle [mm] $j,k=1,\ldots,6$ [/mm] und 0 sonst. Dann gilt
[mm]P(X_1+X_2=m)=\sum\limits_{k} P(X_1=k,X_2=m-k)[/mm]
[mm]=\sum\limits_{1\le k\le 6,1\le m-k\le 6} \frac{1}{36}=\sum\limits_{max\{1,m-6\}}^{min\{6,m-1\}}\frac{1}{36}[/mm]
Man zählt also nur die verschiedenen Möglichkeiten für [mm] $X_1$ [/mm] und [mm] $X_2$, [/mm] um auf das Ereignis [mm] $X_1+X_2=m$ [/mm] zu kommen.
Hilft Dir das? Eigentlich suchst Du doch auch keinen ALgorithmus, sondern eine Formel, wenn ich Dich richtig verstehe. Oder?
Viele Grüße
Brigitte
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 14:45 Di 09.11.2004 | Autor: | lithander |
Hallo Brigitte,
Eigentlich suche ich schon einen Algorithmus, denn ich will die Sache ja programmieren. Eine Formel wär natürlich genauso gut, solange man daraus auf einen Algorithmus schließen kann.
So wie du das für die 2 Würfel beschreibst hab ich das im Prinzip auch gemacht. Nur bei 3 Würfeln wusste ich keine bessere möglichkeit als es genauso über P(x1 = k, x2 = m - k) auszurechnen. wobei x1 ja nun nicht mehr fest ist sondern eine funktion, nämlich die, die du mir gerade erleutert hast: die für 2 würfel. So kommt es, dass sich Summen (In der Programmierung Schleifen) in einander schachteln und sich der Aufwand für jeden weiteren Würfel stark erhöht. Eine Wahrscheinlichkeit für ein Ergebniss bei 6 Würfeln auf diese Weise zu berechnen dauert dann schon 30 Sekunden.
Welche bessere Möglichkeit gibt es?
|
|
|
|
|
Hallo lithander,
30 Sekunden scheint mir etwas viel.
eine rekursive funktion müsste ja gerade mal 6 mal sich selbst aufrufen und intern max. 6*30 (Multipl. + Additionen) erledigen.
Was hast Du für einen Computer?
Was ist das für eine Programmiersprache?
Kannst ja mal den Code posten.
gruß
mathemaduenn
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:04 Mi 10.11.2004 | Autor: | lithander |
Um die "Summe" für 6 Würfel auszurechnen muss man ja jeweils die Wahrscheinlichkeiten für 5 Würfel an der entsprechenden Stelle kennen.
So wird in jeder Rekursionsstufe 6x die Funktion für Würfelanzahl-1 aufgerufen. Das sind bei 6 Würfeln schon [mm] 6^5 [/mm] Aufrufe. (Natürlich könnte man Ergebnisse cachen und so... mach ich vielleicht nochmal... wenn es nicht eine andere, schnellere Methode gibt.)
In meiner aktuellen Version sind's noch ne ganze Menge mehr aber durch brigittes Erklärung hab ich gesehen, dass meine herangehensweise noch nicht so ganz die ideale war.
Ich bring morgen mal den Code mit!
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:49 Do 11.11.2004 | Autor: | lithander |
Hi,
also erstmal vielen Dank an alle! Ich hab mich gestern noch mal drangesetzt und jetzt funktioniert alles wunderbar UND schnell.
Folgender Code ist die Basis:
public static double GetChance(int Value, int Amount, int Sides)
{
return (double)GetPossibles(Value, Amount, Sides) / Math.Pow(Sides, Amount);
}
private static int GetPossibles(int Value, int Amount, int Sides)
{
//Chance that ONE dice shows the number Val is always 1/Sides if Val is in Range
if(Amount == 1)
return (Value > 0 && Value <= Sides)? 1 : 0;
int CDVal = 1; //Current Dice Value
int RDVal = Value-1; //Remaining Dice Value
int Accu = 0;
while(RDVal >= Amount-1 && CDVal <= Sides)
{
//Instead of dividing through Sides every pass it's done once with the result.
Accu += GetPossibles(RDVal, Amount-1, Sides);
CDVal++;
RDVal--;
}
return Accu;
}
Dazu hab ich dann noch nen kleinen Caching-Mechanismus eingebaut und jetzt dauern auch die Berechnungen für Chancen auch bei 10 Würfeln nur ein paar Millisekunden!
Also danke nochmal an alle Helfer!
-lith
|
|
|
|
|
Hallo lithander,
Dein Code sieht auf alle Fälle erstmal richtig aus. Ich wollte aber doch noch mal eine Alternative Möglichkeit angeben.
Diese Funktion würde eine Pointer auf die Wahrscheinlichkeiten, beim n -maligen Würfeln als Summe n,n+1,n+2 usw. zu erhalten, ausgeben.
double * CTestwrfelDlg::wuerfel(int n)
{
double *ret;
int i,j;
ret=new double[6*n];
if(n==1)
{
for(i=0;i<6;i++)
ret[i]=1.0/6.0;
}
else
{
double *buf;
for(i=0;i<6*n;i++)
ret[i]=0.0;
buf=wuerfel(n-1);
// Der Pointer buf enthält jetzt die Wahrscheinlichkeiten beim n-1 maligen
//Würfeln danach wird gefaltet.
for(i=0;i<6*n;i++)
for(j=0;j<6;j++)
if(i-j>=0&&i-j<6*(n-1))
{
ret[i]+=buf[i-j]/6.0;
}
delete [] buf;
}
return ret;
}
Noch ein paar Ergebnisse zum vergleichen
10 - Würfel
P(Summe = 10) = 1.653817e-008 ;
P(Summe = 11) = 1.653817e-007 ;
P(Summe = 12) = 9.095994e-007 ;
P(Summe = 13) = 3.638398e-006 ;
P(Summe = 14) = 1.182479e-005 ;
P(Summe = 15) = 3.310942e-005 ;
P(Summe = 16) = 8.260817e-005 ;
P(Summe = 17) = 1.875429e-004 ;
P(Summe = 18) = 3.929470e-004 ;
P(Summe = 19) = 7.677019e-004 ;
P(Summe = 20) = 1.409515e-003 ;
P(Summe = 21) = 2.446657e-003 ;
P(Summe = 22) = 4.034074e-003 ;
P(Summe = 23) = 6.341893e-003 ;
P(Summe = 24) = 9.535331e-003 ;
P(Summe = 25) = 1.374659e-002 ;
P(Summe = 26) = 1.904155e-002 ;
P(Summe = 27) = 2.538676e-002 ;
P(Summe = 28) = 3.262369e-002 ;
P(Summe = 29) = 4.045733e-002 ;
P(Summe = 30) = 4.846437e-002 ;
P(Summe = 31) = 5.612410e-002 ;
P(Summe = 32) = 6.287044e-002 ;
P(Summe = 33) = 6.815811e-002 ;
P(Summe = 34) = 7.153272e-002 ;
P(Summe = 35) = 7.269281e-002 ;
P(Summe = 36) = 7.153272e-002 ;
P(Summe = 37) = 6.815811e-002 ;
P(Summe = 38) = 6.287044e-002 ;
P(Summe = 39) = 5.612410e-002 ;
P(Summe = 40) = 4.846437e-002 ;
P(Summe = 41) = 4.045733e-002 ;
P(Summe = 42) = 3.262369e-002 ;
P(Summe = 43) = 2.538676e-002 ;
P(Summe = 44) = 1.904155e-002 ;
P(Summe = 45) = 1.374659e-002 ;
P(Summe = 46) = 9.535331e-003 ;
P(Summe = 47) = 6.341893e-003 ;
P(Summe = 48) = 4.034074e-003 ;
P(Summe = 49) = 2.446657e-003 ;
P(Summe = 50) = 1.409515e-003 ;
P(Summe = 51) = 7.677019e-004 ;
P(Summe = 52) = 3.929470e-004 ;
P(Summe = 53) = 1.875429e-004 ;
P(Summe = 54) = 8.260817e-005 ;
P(Summe = 55) = 3.310942e-005 ;
P(Summe = 56) = 1.182479e-005 ;
P(Summe = 57) = 3.638398e-006 ;
P(Summe = 58) = 9.095994e-007 ;
P(Summe = 59) = 1.653817e-007 ;
P(Summe = 60) = 1.653817e-008 ;
Stimmen Sie mit deinen überein?
gruß
mathemaduenn
|
|
|
|