Nochmal Stochastik: Würfel vergleichen.

Übersicht Sonstiges Gamedesign

Neue Antwort erstellen

BladeRunner

Moderator

Betreff: Nochmal Stochastik: Würfel vergleichen.

BeitragMo, Feb 26, 2018 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
folgendes Szenario:
Ich werfe einen achtseitigen Würfel als Probe. Die Ergebnisse 5,6,7 bedeuten einen Erfolg, das Ergebnis 8 bedeutet zwei Erfolge.
Nun werfe ich einen zweiten achtseitigen Würfel: Die Ergebnisse 5,6,7,8 bedeuten hier einen Misserfolg.

Wie groß ist nun die Wahrscheinlichkeit dass ich wenn ich beide Würfel geworfen habe mehr Erfolge als Misserfolge habe, sprich, es muss mindestens ein Erfolg erzielt werden.

Nun noch ausgebaut:
a) wie berechne ich die Wahrscheinlichkeiten wenn ich beliebige Mengen an Erfolgs- und Misserfolgswürfeln zur Verfügung habe?
Beispiel 5 Erfolgswürfel, 3 Misserfolgswürfel.

b) wie ändert sich die Berechnung wenn ich ermitteln will ob 2, 3, ...n Erfolge erzielt wurden.

Hoffe ihr habt ein paar Ideen für mich.
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

Jan_

Ehemaliger Admin

BeitragMo, Feb 26, 2018 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo BR,

1. Würfel

+=3/8 (5,6,7)
-=4/8
++=1/8 (8)

2. Würfel
+=4/8
-=4/8


Gewinn:
1+ 2+ = 1/4 -1/8
1++ 2- =1/8
1++ 2+ = 1/8
=3/8

Verlieren:
1 - 2- = 1/4
=2/8

unentschieden:
1+ 2- =1/4 - 1/8
1- 2+ = 1/4
=3/8
between angels and insects

Jan_

Ehemaliger Admin

BeitragMo, Feb 26, 2018 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich suche noch nach der Formel, aber binome sind es schon einmal nicht:

1
0
1/2 zu 1/2

00 =0
01 =0 u
10 =0 u
11 =1

1/4 zu 3/4

000 = -
001 = -
010 = -
011 = +
100 = -
101 = +
110 = +
111 = +
4/8 zu 4/8

0000 = -
0001 = -
0010 = -
0011 = - u
0100 = -
0101 = - u
0110 = - u
0111 = +

1000 = -
1001 = - u
1010 = - u
1011 = +
1100 = - u
1101 = +
1110 = +
1111 = +

5/16 zu 11/16

00000 = -
00001 = -
00010 = -
00011 = -
00100 = -
00101 = -
00110 = -
00111 = +

01000 = -
01001 = -
01010 = -
01011 = +
01100 = -
01101 = +
01110 = +
01111 = +

10000 = -
10001 = -
10010 = -
10011 = +
10100 = -
10101 = +
10110 = +
10111 = +

11000 = -
11001 = +
11010 = +
11011 = +
11100 = +
11101 = +
11110 = +
11111 = +

16/32 zu 16/32

Edit:

also, bei nur Verlierwürfeln:
Wenn ungerade Anzahl: 50%
wenn gerade anzahl an Würfeln:

n=anzahl würfe

unentschieden nach Binom:
(https://www.cliffsnotes.com/study-guides/algebra/algebra-ii/additional-topics/binomial-coefficients-and-the-binomial-theorem)
Binom : a= (n) über (n/2)
Wahrscheinlichkeit: ((2^n-a)/2)/2^n


Das ganze nehmen wir nun noch mit dem Glücksfaktor:
bei n gerade:
Wahrscheinlichkeit: (((2^n-a)/2)*((50%*verlieren+62,5%*gewinnen)/n))^n
bei n ungerade:
Wahrscheinlichkeit: (50%*verlieren+62,5%*gewinnen)/n)
between angels and insects

PSY

BeitragMo, Feb 26, 2018 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Jan_ hat Folgendes geschrieben:
Hallo BR,

1. Würfel

+=3/8 (5,6,7)
-=4/8
++=1/8 (8)

2. Würfel
+=4/8
-=4/8


Gewinn:
1+ 2+ = 1/4 -1/8
1++ 2- =1/8
1++ 2+ = 1/8
=3/8

Verlieren:
1 - 2- = 1/4
=2/8

unentschieden:
1+ 2- =1/4 - 1/8
1- 2+ = 1/4
=3/8


3/8 wäre ne 37,5%ige Wahrscheinlichkeit zu gewinnen. Tatsächlich ist sie aber 20/64=31.25%

Wenn Du letztendlich MINDESTENS einen Erfolg haben willst, fallen schonmal alle Würfe weg, bei denen der erste Würfel eine 1, 2, 3 oder 4 zeigt. Also insgesamt 32/64 Möglichkeiten die wegfallen.
Wenn der erste Würfel eine 5, 6 oder 7 zeigt, darf der zweite Würfel KEINE 5, 6, 7 oder 8 zeigen, d.h. es fallen wieder jeweils 4/8 Würfen weg, also 12. Das sind ingesamt schon 44/64 Möglichkeiten.
Wenn der erste Würfel ne 8 zeigt, ist es egal was der zweite zeigt.

44/64 Möglichkeiten führen nicht zu mindestens einem Erfolg, d.h. 20/64 Möglichkeiten führen zu mindestens einem Erfolg. Macht 31.25% aller Würfe aus.


Hier ganz anschaulich:
+ = ingesamt 1 Erfolg
++ = ingesamt 2 Erfolge
0 = ingesamt 1 Erfolg und 1 Misserfolg ODER 0 Erfolge und 0 Misserfolge
- = insgesamt 1 Misserfolg

Zitat:
11 o 21 o 31 o 41 o
12 o 22 o 32 o 42 o
13 o 23 o 33 o 43 o
14 o 24 o 34 o 44 o
15 - 25 - 35 - 45 -
16 - 26 - 36 - 46 -
17 - 27 - 37 - 47 -
18 - 28 - 38 - 48 -

51 + 61 + 71 + 81 ++
52 + 62 + 72 + 82 ++
53 + 63 + 73 + 83 ++
54 + 64 + 74 + 84 ++
55 o 65 o 75 o 85 +
56 o 66 o 76 o 86 +
57 o 67 o 77 o 87 +
58 o 68 o 78 o 88 +


Alle + und ++ beinhalten mindestens 1 Erfolg. Ingesamt sinds 20/64 aller möglichen Würfe.

Falls ich keinen Denkfehler drinhab Oo

PSY
PSY LABS Games
Coders don't die, they just gosub without return

BladeRunner

Moderator

BeitragMo, Feb 26, 2018 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke schon mal für eure Antworten,
und ich denke PSY liegt für die ein-Würfel-Problematik schon ganz richtig.
Aber wie sieht es bei mehreren aus?

Bei Jans Berechnung hakt es ein wenig bei mir - warum sollte die Tatsache ob gerade oder ungerade Anzahl an Würfeln geworfen wird auf die grundsätzliche Wahrscheinlichkeitsverteilung Einfluss haben. Die Gesamtsumme der Möglichen Erfolge und der möglichen Misserfolge sollte doch allein entscheidend sein, und deren Anwachsen ist ja über die Anzahl der Würfel linear?
Zudem: wie kommst du auf den "Glücksfaktor", der noch dazu in der Summe größer 100% liegt? Eine Wahrscheinlichkeitsberechnung hat ja nichts mit Glück zu tun, es geht ja stur um die Verteilung der Möglichkeiten auf Ergebnisse.
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

Xeres

Moderator

BeitragMo, Feb 26, 2018 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
tldr: 31.1% für 1:1
a) 72.59% für 5:3


Ich bin nicht gut in Mathe, darum lasse ich das den Computer machen:

Python Code: [AUSKLAPPEN]
#!/usr/bin/python

import random

number_tests = 100000
number_success = 0
number_fails = 0

success_dice = {
    'throws': 5,
    'faces': [1, 2, 3, 4, 5, 6, 7, 8],
    'points': {5: 1, 6: 1, 7: 1, 8: 2}
}

fail_dice = {
    'throws': 3,
    'faces': [1, 2, 3, 4, 5, 6, 7, 8],
    'points': {5: 1, 6: 1, 7: 1, 8: 1}
}


def throwDice(success_dice, fail_dice):
    success_points = 0
    fail_points = 0
    for x in xrange(0, success_dice['throws']):
        roll = random.choice(success_dice['faces'])
        success_points += success_dice['points'].get(roll, 0)
    for x in xrange(0, fail_dice['throws']):
        roll = random.choice(fail_dice['faces'])
        fail_points += fail_dice['points'].get(roll, 0)
    return success_points - fail_points


for x in xrange(0, number_tests):
    if throwDice(success_dice, fail_dice) > 0:
        number_success += 1
    else:
        number_fails += 1


percent_success = 100.0 * number_success / number_tests

print "{} Success Dice and {} Failure Dice => {}% success ({} / {})".format(success_dice['throws'], fail_dice['throws'], percent_success, number_success, number_fails)


Der Code sollte relativ selbsterklärend sein: Jede Würfelart kann konfiguriert werden: Wie viele es gibt, welche Ergebnisse es gibt und wie viel das Ergebnis wert ist. Es wird ein Erfolg gezählt, wenn min. 1 Erfolg übrig blieb.
Nach 10000 Würfen bekommt man einen statistischen Mittelwert.

Wenn es einen simplen Weg gibt, dass in eine rein mathematische Formel zu gießen - nur zu!

Edit: off-by-one fix
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

BladeRunner

Moderator

BeitragMo, Feb 26, 2018 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau eine solche Formels suche ich ja.
Ich weiss dass die Wahrscheinlichkeit mit n Würfeln mit k Seiten mindestens eine x zu würfeln bei
1-(k-(x+1)/k)^n liegt.

Allerdings hilft mir das hier nur begrenzt weiter, denn ich muss ja die Gesamtzahl an "Gewinnen" betrachten, um sie mit den "Verlusten" vergleichen zu können.
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

PSY

BeitragDi, Feb 27, 2018 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:

Ich weiss dass die Wahrscheinlichkeit mit n Würfeln mit k Seiten mindestens eine x zu würfeln bei
1-(k-(x+1)/k)^n liegt.


Also die Wahrscheinlichkeit, eine x oder grösser zu würfeln?

Müsste in dem Fall aber 1-((x-1)/k)^n sein oder?
PSY LABS Games
Coders don't die, they just gosub without return

Midimaster

BeitragDi, Feb 27, 2018 9:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Formel für 2 Würfel könnte man so hinschreiben:

Code: [AUSKLAPPEN]

WÜRFEL 1
=======================
Fall A: 5,6,7   =3/8 +
Fall B: 8       =1/8 ++
Fall C: 1,2,3,4 =4/8 o


WÜRFEL 2
=======================
Fall X: 1234  =4/8  o
Fall Y: 5678  =4/8  -


FORMEL
======================
Erfolg= (A*X) + (B*X) + (B*Y) + (C*0)

Kein Erfolg= (A*Y) + (B*0) + (C*X) + (C*Y)

EINGESETZT:
=====================

Erfolg=
3/8*4/8 + 1/8*4/8 +1/8*4/8 + 0

=12/64 + 4/64 + 4/64

=20/64 = 31,25%


Kein Erfolg=
3/8*4/8 + 0 + 4/8*4/8 + 4/8*4/8

=12/64 + 16/64 + 16/64

=44/64 = 68,75%
 



Für 2 "Erfolgswürfel" gibt es übrigens diese 5 Möglichkeiten:

Code: [AUSKLAPPEN]


Für 2 Erfolgs-Würfel: 
 ++              +++     +      ++++     o     
2*(A*A + B*C)   2*A*B    2*A*C  B*B      C*C

  • Zuletzt bearbeitet von Midimaster am Di, Feb 27, 2018 12:19, insgesamt 4-mal bearbeitet

Jan_

Ehemaliger Admin

BeitragDi, Feb 27, 2018 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
(50%*verlieren+62,5%*gewinnen)/n
ist unter 100% da gewin + verlieren = n sind
@PSY 2 Würfel, 3 zustände = 2^3 = 8 wie kommst du auf 64 Zustände?
es kommt auf gerade und ungerade an, weil es ein unentschieden geben kann
between angels and insects

Midimaster

BeitragDi, Feb 27, 2018 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
@jan

2 Würfel mit 3 Zuständen wären nicht 2^3, sondern 3^2, also 9 mögliche Zustände:

A B C

AA AB AC
BA BB BC
CA CB CC

Es sind aber 2 Würfel mit unterschiedlichen Zuständen

A B C

X Y

AX BX CX
AY BY CY

Das wären 6 Möglichkeiten hat also gar nix mit einer 8 oder einer 64 zu tun!


Die "64" kommt von den Wahrscheinlichkeiten, da es sich ja um zwei 8-seitigen Würfel handelt 8^2=64


Und noch was zu den Wahrscheinlichkeiten in Prozent:

Der Erste würfel liefert zu 3/8 also 37,5% Erfolg, den der zweite Würfel zu 50% wieder zerstören kann also 18.75%

Der Erste würfel liefert aber auch in 1/8 aller Fälle also 12,5% Erfolg, den der zweite Würfel nicht zerstören kann also 12.5%

Der Erste Würfel liefert in 50% aller Fälle Mißerfolg, auf die der zweite Würfel keinen Einfluß mehr hat.

Code: [AUSKLAPPEN]
  18,75% Erfolg
+ 12,50% Erfolg

+ 50,00% Mißerfolg
+ 18,75% Mißerfolg
=================
= 100,00%

PSY

BeitragDi, Feb 27, 2018 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Jan_ hat Folgendes geschrieben:

@PSY 2 Würfel, 3 zustände = 2^3 = 8 wie kommst du auf 64 Zustände?


Es gibt genau 8^2 = 64 Möglichkeiten, 2 8-seitige Würfel zu werfen. Von den möglichen 64 Würfen führen 20 zum gewünschten Ergebnis

--> 20/64 = 31,25%


Das mit den 3 Zuständen greift so nicht. Die Würfe bringen ja nicht die Zustände mit sich, sondern erst die Bewertung
PSY LABS Games
Coders don't die, they just gosub without return

PSY

BeitragDi, Feb 27, 2018 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:

Der Erste würfel liefert zu 3/8 also 37,5% Erfolg, den der zweite Würfel zu 50% wieder zerstören kann also 18.75%

Der Erste würfel liefert aber auch in 1/8 aller Fälle also 12,5% Erfolg, den der zweite Würfel nicht zerstören kann also 12.5%


Eben, und 18.75 + 12.5 = 31.25 QED

Sorry, aus Versehen Doppelpost Crying or Very sad Embarassed Embarassed Crying or Very sad
PSY LABS Games
Coders don't die, they just gosub without return

BladeRunner

Moderator

BeitragDi, Feb 27, 2018 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
np @ Doppelpost, beide Postings tragen ja was sinnvolles bei. Du hast recht PSY, meine "mit n Würfeln mindestens eine x" -Formel war fehlerhaft. Man, ist das lange her.
aber eine allgemeingültige Lösung in Form einer Formel für beliebig viele Würfel scheint es nicht zu geben?
Ich würde es ja vom Rechner durchrechnen lassen, allerdings (ob der benötigten Rekursion) wird das arg rasch den Stack sprengen. Bei 3 Würfeln sind es ja schon 521 Kombinationen, wenn ich nun zB 5 gegen 3 Würfel antreten lasse sind wir schon bei 16777216 Kombinationen die geprüft werden müssen.
Daher hätte es mich halt auch gereizt das ganze als Formel zu haben.

Konkret geht es mir ums Balancing für ein Würfelspiel, und es mag sein dass im Zuge dessen die Erfolgszahlen von mir halt auch noch angepasst werden.
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

PSY

BeitragDi, Feb 27, 2018 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmmm,

mit ner allgemeinen Formel wirds schwierig. Fällt mir auf Anhieb kein Lösungsansatz ein.
Bei 9 Würfeln braucht mein B3D auf meinem Rechner knapp über 9 Sekunden, um die komplette Rekursion durchzugehn. Also bis 9 Würfel sollte es kein Problem darstellen, die Gewinnwahrscheinlichkeit auszurechnen.

Du kannst Dir aber auch einfach ein Programm schreiben, das Dir ne zeitlang x Würfel wirft und auswertet.
Am Ende teilst Du einfach die Anzahl der Gewinne durch die Anzahl der absoluten Würfe. Je länger der Code läuft, umso genauer wird er.
Sollte fürs Balancing Deines Würfelspiels mehr als ausreichen Very Happy

(edit)
Hier haste mal n Code zum Testen. Voreingestellt sind 1 Erfolgswürfel und 1 Failwürfel. Sollte sich dann wie ausgerechnet auf 31.25% annähern. Je länger der Code läuft, desto genauer sollte das Ergebnis sein.

Bei 5 Erfolgswürfeln und 3 Failwürfeln ist die Gewinnwahrscheinlichkeit ca. 72.768%

Code: [AUSKLAPPEN]
Const s = 1             ; Anzahl Erfolgswürfel
Const f = 1             ; Anzahl Failwürfel
Const t = 10000000000   ; Anzahl Würfe

SeedRnd ( MilliSecs() )
CastDices ( s, f, t )
WaitKey
End




Function CastDices# ( s, f, t )
   
   Local x%, y%, i%, foo%, success%, win%, casts%
   
   
   For i = 1 To t
      For x=1 To s
         foo% = Rand ( 8 )
         If foo>4 Then success = success + 1
         If foo=8 Then success = success + 1      ; 8 gibt einen zusätzlichen Erfolg     
      Next
      For y=1 To f
         foo% = Rand ( 8 )
         If foo>4 Then success = success - 1
      Next   
      If success > 0 Then win = win + 1           ; Bei mindestens 1 Erfolg gewinnt der Spieler
      success = 0
      casts = casts + 1
      If casts Mod 1000000 = 0 Then Print "Erfolge:   " + win * 100.0 / casts + "%"      ; Alle 1 MIO Versuche die bis dahin aktuellen Erfolge in PROZENT ausgeben
   Next
   
End Function


PSY
PSY LABS Games
Coders don't die, they just gosub without return

Midimaster

BeitragDi, Feb 27, 2018 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab da auch mal was gebastelt.

Zu Beginn des Codes gibt man beliebige Würfel als Typen ein. Und dann berechnet das Programm alle Kombinationen. Die Syntax ist...

TWurfel.Add Seiten , [Wahrscheinlichkeiten] , [Erfolge]

Die Wahrscheinlichkeiten und Erfolge werden als Array übergeben:

TWurfel.Add 8, [1,3,4] , [2,1,0]

bedeutet ein achtseitiger Würfel mit 3 Varianten

1 Seite mit Erfolg=2
3 Seiten mit Erfolg=1
4 Seiten mit Erfolg=0
BlitzMax: [AUSKLAPPEN]
SuperStrict

TWurfel.Add 8,[3,1,4],[1,2,0]
TWurfel.Add 8,[3,1,4],[1,2,0]
TWurfel.Add 8,[4,4],[0,-1]

TWurfel.JetztWurfeln

Type TWurfel
Global Liste:TList=New TList
Field Nenner%, Oft%[8], Ergebnis%[8], Prozent#[8]

Function Add(Nenner%, Oft%[],Ergebnis%[])
Print "Nehme neuen Wuerfel auf"
Local loc:TWurfel=New TWurfel
loc.Nenner=Nenner
loc.Oft=Oft
loc.Ergebnis=Ergebnis
loc.Berechne
Liste.AddLast loc
Print
End Function


Function JetztWurfeln()
Local Nr%
Print "J E T Z T K O M B I N A T I O N E N B E R E C H N E N "
For Local loc:Twurfel=EachIn Liste
nr=nr+1
Print
Print nr + ". Wuerfel einbringen"
loc.AddResults
Next
End Function


Method Berechne()
For Local i%=0 To Oft.Length-1

Local P#=Oft[i]
Prozent[i]=P/Nenner
Print Prozent[i]
Next
End Method


Method AddResults()
TResult.ResetNeuListe
For Local i%=0 To Oft.Length-1
TResult.Add Prozent[i],Ergebnis[i]
Next
TResult.BerechneTable
TResult.PackListe
End Method



End Type



Type TResult
Field P#,E%
Global AltListe:TList=New TList
Global NeuListe:TList=New TList
Global ZielListe:TList=New TList


Function ResetNeuListe()
Neuliste.Clear()
End Function


Function Add (Prozent#,E%)
Local loc:TResult=New TResult
loc.P=Prozent
loc.E=E
NeuListe.AddLast loc
End Function


Function BerechneTable()
ZielListe.Clear()
If AltListe.count()=0
Print "STARTUP (weil 1.Wuerfel)"
For Local neu:TResult = EachIn NeuListe
Local ziel:TResult=New TResult
ziel.E= neu.e
ziel.P= neu.p
ZielListe.AddLast Ziel
Next
Else
Print "JEDER MIT JEDEM"
For Local alt:TResult = EachIn AltListe
For Local neu:TResult = EachIn NeuListe
Local ziel:TResult=New TResult
ziel.E=alt.E + neu.e
ziel.P= alt.P*neu.p
ZielListe.AddLast Ziel
Next
Next
EndIf
End Function


Function PackListe()
Local Anzahl%, Erfolg%
Print ""
Print "ZWISCHENERGEBNIS"
For Local ziel:TResult = EachIn ZielListe
Print "ERFOLG=" + ziel.E + " Wahrscheinlichkeit=" + (Ziel.p*100) +"%"
Next
Print ""
Print "---> Liste straffen und zur Alt-Liste machen"
AltListe.Clear()
For Local ziel:TResult = EachIn ZielListe
Local Erfolg%=0
For Local vorher:TResult=EachIn AltListe
If ziel.E = vorher.E
Erfolg=1
Print "zusammelegungserfolg bei" +vorher.E
Vorher.P = Vorher.P + Ziel.P
EndIf
Next
If Erfolg=0
Anzahl=Anzahl+1
AltListe.AddLast ziel
EndIf
Next
Print " "
Print "FINALES ERGEBNIS"
For Local alt:TResult = EachIn AltListe
Print "ERFOLG=" + alt.E + " Wahrscheinlichkeit=" + (alt.p*100) +"%"
Next
Print "Anzahl der Kombinationen aktuell=" + Anzahl
Print "_____________________________________________________________"
End Function

End Type


Das ganze ist natürlich heiß gestrickt und hingerotzt, aber funktioniert schon...

BladeRunner

Moderator

BeitragMi, Feb 28, 2018 8:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, Midimaster, I'm impressed.
Ich habe mittlerweile einen Bruteforce-Ansatz hingesaut, der alle Kombinationen in einem Array durchgeht, aber deines schlägt das meinige was die Performance angeht um Längen.
Dein Ansatz ist wirklich extremst interessant, das werd ich mal genauer zerlegen.

Danke!

Der Vollständigkeit halber mein Code:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Const WINDICE:Int = 4
Const FAILDICE:Int = 4
Const SIDEPERDICE:Int = 8
Global StepSize:Int, shiftsize:Int

Global Successes:Int[] = [0 , 0 , 0 , 0 , 1 , 1 , 1 , 2]
Global Losses:Int[] = [0 , 0 , 0 , 0 , -1 , - 1 , - 1 , - 1]

Global minSuccesses:Int = 1

DebugLog "Winning Dice: " + WINDICE
DebugLog "Losing Dice: " + FAILDICE
DebugLog "Side per Dice: " + SIDEPERDICE
DebugLog "Minimum Successes required: " + minSuccesses

'Berechne die nächste Power of two für die Anzahl der Würfelseiten
For Local i:Int = 0 To 30
If 2 ^ i >= SIDEPERDICE
StepSize = 2 ^ i
shiftsize = i
Exit
EndIf
Next

DebugLog "Stepsize: " + StepSize

Global WerteTabelle:Int[stepsize ^ (WINDICE + FAILDICE)]

DebugLog "Array has "+ WerteTabelle.length + " elements."
'Fill the TABLE
For Local i:Int = 0 Until WerteTabelle.length
WerteTabelle[i] = i
Next

'now, iterate through the table and count wins and losses. if at least min successes are reached, increase the counter.

Global Successcount:Int = 0
'debugstop
For Local i:Int = 0 Until Wertetabelle.length
'chop the value into stepsize bits, right to left, and compare them with the win/lose tables.
Local register:Int = Wertetabelle[i]
Local sc:Int = 0
For Local dicenumber:Int = 0 Until WINDICE+FAILDICE
Local value:Int = register & (Stepsize - 1)
'winning dice?
If dicenumber < WINDICE Then
sc:+successes[value]
Else
sc:+losses[value]
EndIf
register = register Shr shiftsize
Next
If sc >= minsuccesses Then successcount:+ 1

Next
DebugLog successcount + " rolls with at least " + minsuccesses + " Success(es) found."
DebugLog "Propability of Success: " + ( (successcount * 1.0 / WerteTabelle.length) * 100) + "%"
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

Midimaster

BeitragMi, Feb 28, 2018 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ah, jetzt weiß ich auch wie du auf die große Anzahl an Möglichkeiten kommst. Du gehts einfach wirklich jede Kombination jeder Seite der Würfel untereinander durch.

Ich berechne nur die Wahrscheinlichkeiten der einzelnen Würfel und kombiniere diese dann ntereinander.

So kommst du auf 8x8x8 =512 Möglichkeiten bei 3 Würfeln

Ich nur auf 3x3x2=18, weil ja der eine Würfeltyp "A" nur 3, der andere sogar Typ "B" nur 2 Varianten bietet.

Der erste Würfel ist gewissermaßen nur "3-seitig", wobei jede Seite ungleichmäßig häufig auftritt. Die 8 benötige ich nur als Teiler, um die drei Wahrscheinlichkeiten 4/8, 3/8 und 1/8 zu berechnen.

Ich konnte die theoretischen Möglichkeiten sogar innerhalb des Berechnungsprozesses weiter straffen, weil es bereits nach dem ersten beiden Würfen (mit 2 A-Würfeln mit 3x3 theoretíschen Kombinationen) in Wirklichkeiten nur 5 "Erfolgs"-Ergebnisse geben kann: 0,1,2,3,4. Und nach dem 3. Wurf (mit dem B-Würfel) sogar nur 6 statt der 18: -1,0,1,2,3,4,5

Mit dem vorliegenden Code kannsrt Du nun jede beliebige Anzahl und Kombination von "A"- und "B"-Würfeln austesten.

Der Sinn der drei TResult Listen:

Die AltListe enthält die Ergebnisse aller vorherigen Würfel.

Die NeuListe wird mit den drei Wahrscheinlichkeiten des aktuellen Würfels gefüllt.

In die Zielliste wird nun jede Kombination aus AltListe und NeuListe berechnet und dort eingetragen.

Am Ende wird aus der ZielListe die AltListe für die nächste Runde


In der Praxis muss man beim ersten Würfel etwas anders vorgehen. Die Neuliste wird direkt (ohne Berechnung) zur ZielListe und so auch zur AltListe für Würfel 2.

Ab Würfel 2 läuft alles normal. Allerdings wird ab jetzt die ZielListe nach doppelten "Erfolg"-Werten untersucht und diese zusammengefasst.


In meinem Code fehlt noch vollständig der Teil zum Bewerten der Ergebnisse. Hier müßte man dann final die letzte AltListe durchgehen und alle Eregnisse mit Erfolg>0 zusammen addieren.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht Sonstiges Gamedesign

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group