Stochastik: kombinierte Würfelwürfe
Übersicht Sonstiges Gamedesign
BladeRunnerModeratorBetreff: Stochastik: kombinierte Würfelwürfe |
So, Feb 15, 2015 21:17 Antworten mit Zitat |
|
---|---|---|
Hi,
folgende Situation: Ich möchte für ein (nicht programmiertes) Game die Wahrscheinlichkeiten für das Eintreten bestimmter kombinierter Würfelwürfe berechnen. Klingt erst mal trivial, scheint es aber nicht zu sein. Ein Beispiel: Ich würfele mit zwei W6 (sechsseitigen Würfeln) und bilde die Summe der Würfe. Ich kann also Ergebnisse von 2-12 erreichen. Die Wahrscheinlichkeit ist aber nicht linear verteilt, eine 2 ist nur bei dem Würfelwurf 1/1 erreichbar, für eine drei gibt es schon folgende Möglichkeiten: 1/2,2/1, für die 4 als Ergebnis ist es dann 1/3,3/1,2/2. Dieses Ergebnis entspricht der Gaußschen Normalverteilung. Nun zu meinem Problem: Ich kann für eine beliebige Anzahl Würfel leicht ermitteln welchen Wertebereich sie abdecken: Anzahl Würfel bis Anzahl würfel*Seiten pro Würfel. Ich kenne auch die Gesamtanzahl an Kombinationen: Würfelseiten^Anzahl Würfel. Gibt es aber eine Formel um für jeden beliebigen Wert eines solchen Summenszenarios die Wahrscheinlichkeit zu ermitteln OHNE sie händisch abzuzählen? Beispiel: 3W6 - wie hoch ist die Wahrscheinlichkeit eine Summe von 9 zu erreichen? Diese Formel sollte idealerweise nicht nur für beliebige Mengen gleicher Würfel gelten sondern auch für die Kombination verschiedener Würfel, Beispiel 2W6+3W10, wie hoch ist die Wahrscheinlichkeit eine 25 zu erreichen? Hat jemand eine zündende Idee? |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
hecticSieger des IS Talentwettbewerb 2006 |
Mo, Feb 16, 2015 0:52 Antworten mit Zitat |
|
---|---|---|
Ich hab's auch nur mit zusammenrechnen einzelner Werte geschafft, dabei wird durch Rekursion auch schnell mal ein Stapelüberlauf produziert
Code: [AUSKLAPPEN] Graphics 800,800,0,2
SetBuffer FrontBuffer() Const MAXW=6 Const MAXS=24 Global AW%=Int(Input$("Anzahl Würfel: ")) If AW>MAXW Then RuntimeError "Zu viele Würfel (max. "+MAXW+")" Global AS%=Int(Input$("Anzahl Seiten: ")) If AS>MAXS Then RuntimeError "Zu viele Seiten (max. "+MAXS+")" Dim W(AW+1) ;Einzelne Würfel Dim Z(MAXW*MAXS) ;Summenrechner Global Werte=AS*AW Local Count ;WÜRFELRESET For Count=1 To AW W(Count)=1 Next Zaehlen() Print "Summe / Wahrscheinlichkeit" For Count=AW To Werte Print Count+" / "+Z(Count) Rect Count*10,790-Z(Count)*(800.0/Werte^2),10,10,1 Next WaitKey Cls Function Zaehlen() Local Count Local Temp Temp=0 For Count=1 To AW Temp=Temp+W(Count) Next Z(Temp)=Z(Temp)+1 For Count=1 To AW If W(Count)<AS Then W(Count)=W(Count)+1:Exit Else W(Count)=1 Next If KeyHit(1) Then End If Not Temp=Werte Zaehlen End Function Ich bin mir auch nicht sicher ob das möglich ist, da du ja nicht die Wahrscheinlichkeit einer bestimmten Zahl, sondern die Summe aller Kombination als Wahrscheinlichkeit haben möchtest. Dadurch ist es unausweichlich zu jeder Summe die Werte anderer "Wahrscheinlichkeiten" mit einzubeziehen. Bei einem Wurf mit einem W6 wäre es ja mit 1/6 Wahrscheinlichkeit angegeben. Kenne ich nun den ersten Wert, kann ich den zweiten Wurf erneut mit 1/6 Wahrscheinlichkeit angeben. Ergibt also 1/6 zu 1/6 (Baumdiagramm). Wenn ich nun aber die Wahrscheinlichkeit der Gesamtsumme wissen möchte, muss ich ja auch die "nebenliegende" Werte berücksichtigen und mit einbeziehen. Das heisst: 2 und 3 sind wie 3 und 2 wie auch 4 und 1 wie auch 1 und 4. Das dumme dabei ist, dass die Gausche-Normalverteilung hier nicht immer gilt. Wie im Beispielcode ersichtlich, ist bei einem Würfel die Wahrscheinlichkeitskurve flach. Bei zwei Würfeln eine kantige Pyramide und bei mehr als zwei Würfel erst eine Kurve zu erkennen. Das heißt, eine runter gebrochene Kurve aus einer detailierten Tabelle (wie man es zum Teil früher bei Sinuskurven gemacht hat) ist hier meiner Meinung nach nicht möglich. Aber ich lasse mich gerne überraschen und werde mal weiter grübeln. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
- Zuletzt bearbeitet von hectic am Mo, Feb 16, 2015 1:05, insgesamt einmal bearbeitet
hecticSieger des IS Talentwettbewerb 2006 |
Mo, Feb 16, 2015 0:53 Antworten mit Zitat |
|
---|---|---|
Sorry für Doppelpost, hab echt gewartet ... Dabei wurde es bereits hoch geladen
Edit1 egal, weils Spaß macht hier noch mal mein Ansatz ohne Rekursion Code: [AUSKLAPPEN] Graphics 800,200,0,2
SetBuffer FrontBuffer() Local AW%=Int(Input$("Anzahl Würfel die ins Spiel geworfen werden: ")) Local AS%=Int(Input$("Anzahl Seiten die jeweils ein Würfel hat: ")) Local WS%=Int(Input$("Welche Summe soll geprüft werden: ")) Print "Die Summe "+WS+" kommt bei "+AW+" Würfel mit jeweils "+AS+" Seiten mit einer Wahrscheinlichkeit von "+Ausgeben(WS,AW,AS)+"%" WaitKey Function Ausgeben#(FValue,FThrow,FSides) If FValue<FThrow Then RuntimeError "Angegebener Wert zu klein" If FValue>FSides*FThrow Then RuntimeError "Angegebener Wert zu groß" Local Bank=CreateBank(FThrow) Local Maximus#=FSides^FThrow Local Loop1 Local Loop2 Local Value Local Score#=0 Local Pos For Loop1=0 To FThrow-1 PokeByte(Bank,Loop1,1) Next For Loop1=0 To Maximus-1 Value=0 For Loop2=0 To FThrow-1 Value=Value+PeekByte(Bank,Loop2) Next If Value=FValue Then Score=Score+1 Pos=0 Repeat If KeyHit(1) Then End PokeByte(Bank,Pos,PeekByte(Bank,Pos)+1) If PeekByte(Bank,Pos)>FSides Then PokeByte(Bank,Pos,1) Pos=Pos+1 Else Exit End If Forever Next FreeBank Bank Return (100*Score/Maximus) End Function Mach doch ein Wettbewerb, wer den besten Code schreibt |
||
DAK |
Mo, Feb 16, 2015 10:08 Antworten mit Zitat |
|
---|---|---|
Geht's dir darum es zu berechnen oder willst du nur die Ergebnisse haben? Im 2. Fall schau dir diese Seite an.
Möchtest du es berechnen, dann schau hier hin. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
PSY |
Mi, Feb 25, 2015 4:06 Antworten mit Zitat |
|
---|---|---|
Hi...
Willst Du die Wahrscheinlichkeiten berechnen, damit Du weisst welche Wuerfel Du spaeter zwecks gutem balancing im Game verwendest? Oder soll das prinzipiell waehrend der Laufzeit geschehen? Cheers, PSY |
||
PSY LABS Games
Coders don't die, they just gosub without return |
BladeRunnerModerator |
Mi, Feb 25, 2015 10:54 Antworten mit Zitat |
|
---|---|---|
Ersteres - für während des spieles wäre das deutlich zu aufwändig | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
DAK |
Mi, Feb 25, 2015 15:36 Antworten mit Zitat |
|
---|---|---|
In diesem Fall sollte dir das Tool dann ja alles geben was du brauchst, oder? | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
Übersicht Sonstiges Gamedesign
Powered by phpBB © 2001 - 2006, phpBB Group