Wahrscheinlichkeit mit 5 Würfeln

nciht

Vice Admiral
🎅 Nikolaus-Rätsel-Elite
Registriert
Okt. 2017
Beiträge
7.006
Ich bin kein Mathematiker, aber ggf. kann mir jemand von euch bei meinem Problem hier helfen.

Es geht um 5 sechsseitige Würfel mit denen Päsche, Drillinge, Vierlinge, oder gar Fünflinge gewürfelt werden sollen (Nur diese zählen als Ergebnis - Die Würfel werden gleichzeitig gewürfelt).
Als Endergebnis soll immer der höchste Pasch/Drilling/etc. zählen, wobei z.B. ein 6er-Pasch (2x6=12) höher ist als ein 2er-Drilling (3x2=6). Dadurch sind (wenn ich mich nicht irre) Ergebnisse zwischen 2 (1er Pasch) und 30 (6er-Fünfling) möglich.

Beispiele:

Würfelergebnisse: 4;4;1;2;2 -> Ergebnis ist 8 (der 2er Pasch wird ignoriert, weil der 4er-Pasch höher ist)
Würfelergebnisse: 5;5;2;2;2 -> Ergebnis ist 10 (der 2er-Drilling wird ignoriert, weil der 5er-Pasch höher ist)

Nun sind meine Fragen,

- wie ich am einfachsten die Wahrscheinlichkeit für jedes Ergebnis (zwischen 2 und 30) ausrechne. Für 30 ist klar, das wäre 1 zu 7776, oder? Im Internet habe ich bei schneller Suche nur Wahrscheinlichkeiten für zwei sechsseitige Würfel gefunden. Da kann man sich noch leicht alle 36 möglichen Würfelergebnisse notieren und dann einfach schauen, wie oft XY vorkommt, aber hier werde ich irgendeine Formel brauchen.

- wie ich die Wahrscheinlichkeit ausrechne, dass man überhaupt ein Pasch, Drilling, Vierling, oder gar Fünfling würfelt (bzw. wie hoch die Wahrscheinlichkeit ist nichts davon zu würfeln) und auch die einzelnen Wahrscheinlichkeiten z.B. nur für einen Pasch.

Das ganze ist keine Hausaufgabe o.Ä. (bin aus der Schule lange heraus) ... es ist einfach für ein Spiel, wo ich gerne die Wahrscheinlichkeiten ausrechnen würde, damit ich das ganze leichter balancen kann.

Danke im Voraus an die Mathematiker unter euch.


Zusatz:

Korrigiert mich, wenn ich falsch Liege:

Um einen bestimmten Fünfling zu würfeln wäre die Wahrscheinlichkeit 1:7776
Um einen beliebigen Fünfling zu würfeln müsste die Wahrscheinlickeit dann ja 6:7776 sein


Jetzt hab ich mir für Vierlinge mal eine Tabelle erstellt. Um z.B. einen 1er Vierling zu würfeln komme ich auf 25 verschiedene Möglichkeiten. Dann müsste es ja insgesamt 150 (6x25) Möglichkeiten geben überhaupt einen Vierling zu würfeln. Ergo:

Um einen bestimmten Vierling zu würfeln wäre die Wahrscheinlichkeit 25:7776
Um einen beliebigen Vierling zu würfeln wäre die Wahrscheinlichkeit 150:7776

Bin ich da auf dem Holzweg?

1​
1​
1​
1​
1​
2​
2​
1​
1​
1​
1​
3​
3​
1​
1​
1​
1​
4​
4​
1​
1​
1​
1​
5​
5​
1​
1​
1​
1​
6​
6​
1​
1​
1​
2​
1​
7​
1​
1​
1​
3​
1​
8​
1​
1​
1​
4​
1​
9​
1​
1​
1​
5​
1​
10​
1​
1​
1​
6​
1​
11​
1​
1​
2​
1​
1​
12​
1​
1​
3​
1​
1​
13​
1​
1​
4​
1​
1​
14​
1​
1​
5​
1​
1​
15​
1​
1​
6​
1​
1​
16​
1​
2​
1​
1​
1​
17​
1​
3​
1​
1​
1​
18​
1​
4​
1​
1​
1​
19​
1​
5​
1​
1​
1​
20​
1​
6​
1​
1​
1​
21​
2​
1​
1​
1​
1​
22​
3​
1​
1​
1​
1​
23​
4​
1​
1​
1​
1​
24​
5​
1​
1​
1​
1​
25​
6​
1​
1​
1​
1​

Kann jetzt halt bei Drillingen keine Tabelle mehr machen :D
 
Zuletzt bearbeitet:
Ich glaube oft ist es in der Stochastik und Wahrscheinlichkeitsrechnung simpler als man glaubt (oder ich verzettel mich gerade total ;))
Jede Würfelkombination ist bei jedem Wurf gleich wahrscheinlich. Somit ist deine Wahscheinlichkeit für Kombination x - also auch jeder Vierling, Fünfling - (1/Seitenzahl)^(Anzahl Würfel).
5 Würfel, 6 Seiten = (1/6)^5
 
@T00L

Es gibt nur eine Möglichkeit einen Fünfling mit 4ern zu würfeln, aber es gibt 25 Möglichkeiten einen Vierling mit 4ern zu würfeln. Du musst beachten, dass beim Vierling eine Zahl egal ist und es ist auch egal welcher der fünf Würfel keine 4 Würfelt (siehe Tabelle oben) ... Die Wahrscheinlichkeit einen Vierling zu würfeln ist also um ein vielfaches höher, als die Wahrscheinlichkeit einen Fünfling zu würfeln... ist wohl auch logisch. Mein Problem war jetzt eher herauszufinden, wie viele der 7776 verschiedenen Möglichkeiten z.B. ein beliebiger, oder ein bestimmter Pasch sind.



Ich bin mit dieser Website (Beispiel 14) jetzt schon weiter gekommen (habe nach Wahrscheinlichkeiten für Kniffel gesucht).

Daraus resultierend habe ich die folgenden Tabellen erstellt.

Anzahl der Möglichkeiten von 7776 und Wahrscheinlichkeit
beliebiger%bestimmter%
Pasch
3600​
~46,3%​
600​
~7,72%
Drilling
1200​
~15,4%​
200​
~2,57%
Vierling
150​
~1,9%​
25​
~0,32%
Fünfling
6​
~0,08%​
1​
~0,01%

Mögliche Zahlengenauer Treffergleich, oder größer
2​
~7,72%​
~61,48%​
3​
~0,32%​
~53,77%​
4​
~8,04%​
~53,45%​
5​
~0,01%​
~45,41%​
6​
~10,29%​
~45,40%​
8​
~8,04%​
~35,11%​
9​
~2,57%​
~27,07%​
10​
~7,73%​
~24,50%​
12​
~10,61%​
~16,77%​
15​
~2,58%​
~6,16%​
16​
~0,32%​
~3,58%​
18​
~2,57%​
~3,25%​
20​
0,33%​
~0,68%​
24​
~0,32%​
~0,35%​
25​
~0,01%​
~0,03%​
30​
~0,01%​
~0,01%​

Problem ist hier jetzt, dass ein "Full House" nicht berücksichtigt wurde, also die Möglichkeiten für einen Zwilling und einen Drilling fehlen, genauso wie die Möglichkeiten für zwei Zwillinge. Kann gerade nicht ableiten, was die Wahrscheinlichkeit für ein bestimmtes "Full House" wäre, bzw. für zwei bestimmte Zwillinge. Für mich ist aber gerade interessant, wie diese Tabellen aussehen würden, wenn das zusätzlich noch berücksichtigt wird.

Da dort ~9,26% die Wahrscheinlichkeit ist, dass nur "Einlinge", also keine Zahl kommt mehr als ein Mal im Wurf vor, gehe ich davon aus, dass die tatsächliche Wahrscheinlichkeit, nach meinen Regeln eine 2, oder höher als Ergebnis zu erhalten, bei ~90,74% liegen muss.


________________________________________
Edit: jetzt habe ich nach meinen Regeln noch mal das ganze Angepasst: Die Möglichen Ergebnisse sollten jeweils die folgenden Wahrscheinlichkeiten haben. Wenn mir das jemand noch mal nachrechnen und bestätigen könnte, wäre das super. (Ich habs ohne irgend ne Formel gemacht - einfach die Möglichkeiten aufaddiert)

Stimmt das so?
Mögliche Zahlengenauer Treffergleich, oder größer
2​
~7,72%​
~90,74%​
3​
~2,57%​
~83,02%​
4​
~9,71%​
~80,45%​
5​
~0,01%​
~70,74%​
6​
~13,76%​
~70,73%​
8​
~12,92%​
~56,97%​
9​
~2,96%​
~44,05%​
10​
~14,29%​
~41,09%​
12​
~19,35%​
~26,80%​
15​
~3,23%​
~7,45%​
16​
~0,32%​
~4,22%​
18​
~3,22%​
~3,90%​
20​
~0,33%​
~0,68%​
24​
~0,32%​
~0,35%​
25​
~0,01%​
~0,03%​
30​
~0,01%​
~0,01%​


Dazu habe ich mir mehrere Tabellen gemacht.

Für jede Kombination gibt es 120 mögliche Würfelergebnisse. Das Ergebnis in der Tabelle ist die Zahl, welche dann lt. Regeln das Ergebnis stellt.
Ergebnis
1,1,2,24
1,1,3,36
2,2,3,36
1,1,4,48
2,2,4,48
3,3,4,48
1,1,5,510
2,2,5,510
3,3,5,510
4,4,5,510
1,1,6,612
2,2,6,612
3,3,6,612
4,4,6,612
5,5,6,612

Für jede Kombination gibt es 10 mögliche Würfelergebnisse. Ich hab dann jedes "Full House einem Zwilling, oder einem Drilling zugeordnet und wenn beides möglich war, hab ich die einfach gesplittet. (also 5 Ergebnisse dem Zwilling und 5 Ergebnisse dem Drilling zugeordnet)
ErgebnisZw=Zwilling
Dr=Drilling
1,1,1,2,24Zw
1,1,1,3,36Zw
1,1,1,4,48Zw
1,1,1,5,510Zw
1,1,1,6,612Zw
2,2,2,1,16Dr
2,2,2,3,36Beides
2,2,2,4,48Zw
2,2,2,5,510Zw
2,2,2,6,612Zw
3,3,3,1,19Dr
3,3,3,2,29Dr
3,3,3,4,49Dr
3,3,3,5,510Zw
3,3,3,6,612Zw
4,4,4,1,112Dr
4,4,4,2,212Dr
4,4,4,3,312Dr
4,4,4,5,512Dr
4,4,4,6,612Beides
5,5,5,1,115Dr
5,5,5,2,215Dr
5,5,5,3,315Dr
5,5,5,4,415Dr
5,5,5,6,615Dr
6,6,6,1,118Dr
6,6,6,2,218Dr
6,6,6,3,318Dr
6,6,6,4,418Dr
6,6,6,5,518Dr

In der Folgenden Tabelle rechne ich dann zusammen, dass z.B. der 2er-Zwilling 120 Mögliche Würfelergebnisse von (1,1,2,2), also Zwei Zwillinge mit 1ern und 2ern und 10 mögliche Würfelergebnisse vom "Full House" aus 1er-Drilling und 2er-Zwilling erhält, was insgesamt dann 730 Möglichkeiten für einen 2er Zwilling bzw. die Zahl 4 ergibt.
Zwilling (je 600 Möglichkeiten)
WürfelergebnisM Anzahl
1,1​
2
600​
2,2​
4
730​
3,3​
6
855​
4,4​
8
980​
5,5​
10
1110​
6,6​
12
1235​
Drilling (je 200 Möglichkeiten)
WürfelergebnisM Anzahl
1,1,13
200​
2,2,26
215​
3,3,39
230​
4,4,412
245​
5,5,515
250​
6,6,618
250​
Vierling (je 25 Möglichkeiten)
WürfelergebnisM Anzahl
1,1,1,14
25​
2,2,2,28
25​
3,3,3,312
25​
4,4,4,416
25​
5,5,5,520
25​
6,6,6,624
25​
Fünfling (je 1 Möglichkeit)
WürfelergebnisM Anzahl
1,1,1,1,15
1​
2,2,2,2,210
1​
3,3,3,3,315
1​
4,4,4,4,420
1​
5,5,5,5,525
1​
6,6,6,6,630
1​
Insgesamt komme ich dann auf 7776 Mögliche Würfelergebnisse, was ja richtig sein sollte und auf die Prozente in der oberen "Tabelle Prozente" ...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Insanic
Willst du ernsthaft beim Kniffel "Karten zählen"? Das ist ein Glücksspiel... ^^
 
Habs jetzt nur überflogen, aber grundsätzlich sieht das richtig aus.
Kannst du etwas programmieren? Deine Ergebniss algorithmus zu verifizieren ist eine nette kleine Aufgabe die man ohne großen Aufwand machen kann.
 
  • Gefällt mir
Reaktionen: new Account() und nciht
ayngush schrieb:
Willst du ernsthaft beim Kniffel "Karten zählen"? Das ist ein Glücksspiel... ^^
Es geht nicht um Kniffel... das sollte im ersten Post aber auch klar sein...ich suche nach einem interessanten Würfelsystem für Tabletop/P&P ... ich fand diese Idee interessant, weil Spieler sich die Chancen nicht so leicht nachrechnen können.
BeBur schrieb:
Kannst du etwas programmieren?
Mal Java damals im Informatik Leistungskurs gelernt. Das ist aber so lange her, dass ich jetzt ohne nachzuschauen nicht mal mehr Hello World hinbekäme ... :D

Ich wäre jetzt eher noch daran interessiert, wie das in eine mathematische Formel zu packen wäre, die mir so weit klar ist, dass ich das ganze mit 8-,10-, oder auch 12-seitigen Würfeln, unterschiedlicher Anzahl probieren kann und dabei schnell alle Ergebnisse habe... oder wird ne Formel a.G.d. Ausschlüsse zu kompliziert?
 
Zuletzt bearbeitet:
Aphelon schrieb:
Mal Java damals im Informatik Leistungskurs gelernt. Das ist aber so lange her, dass ich jetzt ohne nachzuschauen nicht mal mehr Hello World hinbekäme ...
Kein Ding, irgendein Kellerkind hat bestimmt nichts besseres zu tun als.. oh ich glaube das trifft ja auf mich zu ;D.

PS.: Oh, ich sehe gerade ich habe eine Randbedingung nicht mit eingebaut, nämlich, dass nur Pasch, Drilling etc. gewertet wird und einzelne Zahlen nicht. Habe ich evtl. morgen Abend gelegenheit zu das zu korrigieren.

Code:
n = 100_000_000
results = DefaultDict(0)
for i ∈ 1:n
    dice_roll = Base.rand(1:6, 5)
    sums = DefaultOrderedDict(0)
    for dice ∈ dice_roll
        sums[dice] += dice
    end
    points = maximum(collect(values(sums)))
    results[points] += 1
end
number_format = FormatSpec(">5.2f")
map!(r -> string(fmt(number_format, r*100/n), " %"), values(results)) # Transform to relative results
show(stdout, "text/plain", sort(collect(results)))
Ergebnis:
Code:
 3 => " 0.26 %"
 4 => " 3.15 %"
 5 => " 7.41 %"
 6 => "32.21 %"
 8 => "12.92 %"
 9 => " 2.96 %"
10 => "14.29 %"
12 => "19.36 %"
15 => " 3.23 %"
16 => " 0.32 %"
18 => " 3.22 %"
20 => " 0.33 %"
24 => " 0.32 %"
25 => " 0.01 %"
30 => " 0.01 %"
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: nciht
Cool danke dir... ja, es werden nur Mehrlinge gewertet und falls davon mehrere im Wurf sein sollten auch nur der in der Summe höhere.

__________________________

Edit: Ich hab jetzt noch mal durchgerechnet, wie das aussähe, wenn man alle Mehrlinge zusammenzählt, falls es mehrere geben sollte. Dadurch komme ich auf die folgende Tabelle.

Alle %-Ergebnisse sind gerundet
Mögliche ZahlenMöglichkeitengenauer Treffergleich, oder größergleich, oder kleiner
2​
600​
7,72%​
90,74%​
16,98%​
3​
200​
2,57%​
83,02%​
19,55%​
4​
625​
8,04%​
80,45%​
27,58%​
5​
1​
0,01%​
72,41%​
27,60%​
6​
920​
11,83%​
72,40%​
39,43%​
7​
10​
0,13%​
60,57%​
39,56%​
8​
755​
9,71%​
60,44%​
49,27%​
9​
210​
2,70%​
50,73%​
51,97%​
10​
841​
10,82%​
48,03%​
62,78%​
11​
20​
0,26%​
37,22%​
63,04%​
12​
1075​
13,82%​
36,96%​
76,86%​
13​
20​
0,26%​
23,13%​
77,12%​
14​
380​
4,89%​
22,88%​
82,01%​
15​
221​
2,84%​
17,99%​
84,85%​
16​
285​
3,67%​
15,15%​
88,52%​
17​
20​
0,26%​
11,48%​
88,77%​
18​
460​
5,92%​
11,23%​
94,69%​
19​
20​
0,26%​
5,31%​
94,95%​
20​
166​
2,13%​
5,05%​
97,08%​
21​
10​
0,13%​
2,92%​
97,21%​
22​
140​
1,80%​
2,79%​
99,01%​
23​
10​
0,13%​
0,99%​
99,14%​
24​
35​
0,45%​
0,86%​
99,59%​
25​
1​
0,01%​
0,41%​
99,60%​
26​
10​
0,13%​
0,40%​
99,73%​
27​
10​
0,13%​
0,27%​
99,86%​
28​
10​
0,13%​
0,14%​
99,99%​
29​
0​
0,00%​
0,01%​
99,99%​
30​
1​
0,01%​
0,01%​
100%​

Mir gefällt das doch ein bisschen besser, da doch deutlich mehr ungerade Zahlen als Ergebnis möglich werden. Nur die 29 lässt sich so nicht erwürfeln...

1583247225453.png
 
Zuletzt bearbeitet:
Der vollständigkeit halber noch der korrigierte Code+Ergebnis:
Code:
using DataStructures
using Formatting

n = 100_000_00
results = DefaultDict(0)
for i ∈ 1:n
    dice_roll = Base.rand(1:6, 5)
    sums = DefaultOrderedDict(0)
    for dice ∈ dice_roll
        sums[dice] += dice
    end
    filter!(s -> last(s) > first(s), sums)
    if !isempty(sums)
        points = maximum(collect(values(sums)))
        results[points] += 1
    end
end
number_format = FormatSpec(">5.2f")
map!(r -> string(fmt(number_format, r*100/n), " %"), values(results)) # Transform to relative results
show(stdout, "text/plain", sort(collect(results)))
Ergebnis:
Code:
  2 => " 7.72 %"
  3 => " 2.56 %"
  4 => " 9.70 %"
  5 => " 0.01 %"
  6 => "13.76 %"
  8 => "12.92 %"
  9 => " 2.95 %"
10 => "14.30 %"
12 => "19.36 %"
15 => " 3.23 %"
16 => " 0.32 %"
18 => " 3.22 %"
20 => " 0.33 %"
 
  • Gefällt mir
Reaktionen: nciht
Aphelon schrieb:
Edit: Ich hab jetzt noch mal durchgerechnet, wie das aussähe, wenn man alle Mehrlinge zusammenzählt, falls es mehrere geben sollte. Dadurch komme ich auf die folgende Tabelle.

Alle %-Ergebnisse sind gerundet
Mögliche ZahlenMöglichkeitengenauer Treffergleich, oder größergleich, oder kleiner
2​
600​
7,72%​
90,74%​
16,98%​
3​
200​
2,57%​
83,02%​
19,55%​
4​
625​
8,04%​
80,45%​
27,58%​
5​
1​
0,01%​
72,41%​
27,60%​
6​
920​
11,83%​
72,40%​
39,43%​
7​
10​
0,13%​
60,57%​
39,56%​
8​
755​
9,71%​
60,44%​
49,27%​
9​
210​
2,70%​
50,73%​
51,97%​
10​
841​
10,82%​
48,03%​
62,78%​
11​
20​
0,26%​
37,22%​
63,04%​
12​
1075​
13,82%​
36,96%​
76,86%​
13​
20​
0,26%​
23,13%​
77,12%​
14​
380​
4,89%​
22,88%​
82,01%​
15​
221​
2,84%​
17,99%​
84,85%​
16​
285​
3,67%​
15,15%​
88,52%​
17​
20​
0,26%​
11,48%​
88,77%​
18​
460​
5,92%​
11,23%​
94,69%​
19​
20​
0,26%​
5,31%​
94,95%​
20​
166​
2,13%​
5,05%​
97,08%​
21​
10​
0,13%​
2,92%​
97,21%​
22​
140​
1,80%​
2,79%​
99,01%​
23​
10​
0,13%​
0,99%​
99,14%​
24​
35​
0,45%​
0,86%​
99,59%​
25​
1​
0,01%​
0,41%​
99,60%​
26​
10​
0,13%​
0,40%​
99,73%​
27​
10​
0,13%​
0,27%​
99,86%​
28​
10​
0,13%​
0,14%​
99,99%​
29​
0​
0,00%​
0,01%​
99,99%​
30​
1​
0,01%​
0,01%​
100%​

Hi, ich hab das Ganze durch mal automatisch erstellen lassen und komme dabei bei 15, 20, 21 und 24 auf jeweils 10 Kombintationen mehr/weniger als du:
Ergebnis​
Möglichkeiten​
0​
720​
1​
0​
2​
600​
3​
200​
4​
625​
5​
1​
6​
920​
7​
10​
8​
755​
9​
210​
10​
841​
11​
20​
12​
1075​
13​
20​
14​
380​
15​
211​
16​
285​
17​
20​
18​
460​
19​
20​
20​
156​
21​
20​
22​
140​
23​
10​
24​
45​
25​
1​
26​
10​
27​
10​
28​
10​
29​
0​
30​
1​
Dazu hier noch die 20 Möglichkeiten für 21:
Code:
Sum is 21 at 3 3 3 6 6
Sum is 21 at 3 3 5 5 5
Sum is 21 at 3 3 6 3 6
Sum is 21 at 3 3 6 6 3
Sum is 21 at 3 5 3 5 5
Sum is 21 at 3 5 5 3 5
Sum is 21 at 3 5 5 5 3
Sum is 21 at 3 6 3 3 6
Sum is 21 at 3 6 3 6 3
Sum is 21 at 3 6 6 3 3
Sum is 21 at 5 3 3 5 5
Sum is 21 at 5 3 5 3 5
Sum is 21 at 5 3 5 5 3
Sum is 21 at 5 5 3 3 5
Sum is 21 at 5 5 3 5 3
Sum is 21 at 5 5 5 3 3
Sum is 21 at 6 3 3 3 6
Sum is 21 at 6 3 3 6 3
Sum is 21 at 6 3 6 3 3
Sum is 21 at 6 6 3 3 3
 
ah, da werde ich zwei mal falsch zugeordnet/gerechnet haben. Bin die „Full House“ nur schnell im Kopf durchgegangen und hab mir die Ergebnisse notiert. Könntest du auch den Code hier hereinstellen, wie du es ausgerechnet hast? Ließe sich der ggf. einfach modifizieren, sodass ich Seitenzahl/Anzahl der Würfel ändern könnte...
 
Jup, kann ich machen. Ist ziemlich hässlich, mit dem Ansatz einer veränderlichen Würfelzahl, der dann aber nicht durchgezogen ist, weil ich das nur schnell heute abend zusammengeschrieben hatte. Bittesehr:
C++:
#include <stdio.h>
#include <vector>
#include <math.h>

class Result{
public:
    Result()
     : mNumberOfDice(5), mResult(0)
     {}
    ;

    Result(short iNumberOfDice)
     : mNumberOfDice(iNumberOfDice), mResult(0)
     {}
    ;

    Result(short iNumberOfDice, std::vector<short> iResult)
     : mNumberOfDice(iNumberOfDice), mResult(iResult)
     {}
    ;
    
    short mNumberOfDice;
    std::vector<short> mResult;
    
    short evaluateResult(){
        short resultPerEye[6+1] = {0, 0, 0, 0, 0, 0};
        //add points for each eye
        for(int i=0; i<mNumberOfDice; i++){
            resultPerEye[mResult[i]] += mResult[i];
        }
        //remove single dice
        for(int i=1; i<=6; i++){
            if (resultPerEye[i] <= i)
                resultPerEye[i] = 0;
        }
        //find highest points
        //short max=0;
        //for(int i=1; i<=6; i++){
        //    if (resultPerEye[i] > max)
        //        max = resultPerEye[i];
        //}
        //return max;
        
        //sum all tuples
        short sum=0;
        for(int i=1; i<=6; i++){
                sum += resultPerEye[i];
        }
        
        //if (sum==21){
        //    printf("Sum is 21 at %d %d %d %d %d\n", mResult[0], mResult[1], mResult[2], mResult[3], mResult[4]);
        //}
        return sum;
    };
};

int main()
{
    const short numberOfDice = 5;
    int numberOfPossibilities = pow(6, numberOfDice);
    
    //std::vector<Result> allPossibilities(numberOfPossibilities);
    std::vector<Result> allPossibilities;
    
    
    //generate all Possibilities
    std::vector<short> currentResult(6);
    for(short a=1; a<7; a++){
        for(short b=1; b<7; b++){
            for(short c=1; c<7; c++){
                for(short d=1; d<7; d++){
                    for(short e=1; e<7; e++){
                        currentResult = {a, b, c, d, e};
                        allPossibilities.push_back(Result(5, currentResult));
                    }
                }
            }
        }
    }
    
    //evaluate Results
    int occurances[31];
    for(int i=0; i<31; i++){
        occurances[i] = 0;
    }
    int tempResult;
    for(int i=0; i<numberOfPossibilities; i++){
        tempResult = allPossibilities[i].evaluateResult();
        occurances[tempResult]++;
    }
    
    for(int i=0; i<31; i++){
        printf("%d occured: %d times\n", i, occurances[i]);
    }
    
    return 0;
}
 
  • Gefällt mir
Reaktionen: nciht
Ich hab den Code mal ein bisschen abgeändert und für variable Anzahl an Würfeln und Würfelseiten umgebaut:
C++:
#include <stdio.h>
#include <vector>
#include <math.h>

class Result{
public:
    Result(short iNumberOfDice, short iNumberOfSides, int iID)
     : mNumberOfDice(iNumberOfDice), mID(iID), mNumberOfSides(iNumberOfSides)
     {
         mDiceEyes = populateDiceByID();
     }
    ;
  
    short mNumberOfDice;
    short mNumberOfSides;
    int mID;
    std::vector<short> mDiceEyes;
  
    short evaluateResult(){
        short resultPerEye[mNumberOfSides+1] = {0};
        //add points for each eye
        for(int i=0; i<mNumberOfDice; i++){
            resultPerEye[mDiceEyes[i]] += mDiceEyes[i];
        }
        //remove single dice
        for(int i=1; i<=mNumberOfSides; i++){
            if (resultPerEye[i] <= i)
                resultPerEye[i] = 0;
        }
        //find highest points
        //short max=0;
        //for(int i=1; i<=mNumberOfSides; i++){
        //    if (resultPerEye[i] > max)
        //        max = resultPerEye[i];
        //}
        //return max;
      
        //sum all tuples
        short sum=0;
        for(int i=1; i<=mNumberOfSides; i++){
                sum += resultPerEye[i];
        }
        return sum;
    };
  
    std::vector<short> populateDiceByID(){
        short tempInt=0;
        std::vector<short> tempVector;
        for(int i=0; i<mNumberOfDice; i++){
            tempInt = (mID / (int) pow(mNumberOfSides, i)) % mNumberOfSides + 1;
            tempVector.push_back(tempInt);
        }
        return tempVector;
    };
};

int main()
{
    short numberOfDice = 5;
    short numberOfSides = 6;
    int numberOfPossibilities = pow(numberOfSides, numberOfDice);
    int maxResult = numberOfDice*numberOfSides;
  
    //generate and evaluate all Possibilities
    std::vector<int> occurances(maxResult+1);
    int tempPoints;
    for(int i=0; i<numberOfPossibilities; i++){
        Result tempResult = Result(numberOfDice, numberOfSides, i);
        tempPoints = tempResult.evaluateResult();
        occurances[tempPoints]++;
    }
  
    for(int i=0; i<maxResult+1; i++){
        printf("%d occured %d times, possibility is %.2f%%\n", i, occurances[i], (double) 100*occurances[i]/numberOfPossibilities);
    }
  
    return 0;
}
Nicht unbedingt performant, aber erfüllt seinen Zweck. Und wäre mit OMP leicht zu parallelisieren.
 
Zuletzt bearbeitet: (cast der Potenz in Zeile 50 auf int statt short)
  • Gefällt mir
Reaktionen: nciht
oh vielen Dank.... damit werde ich dann mal ein bisschen herumspielen...
 
Kann sein, dass du bei großen Zahlen die Datentypen von int auf long erweitern musst. Ich hatte bspw. gerade bei 7 sechsseitigen Würfeln das Problem, dass 6^7 nicht mehr in einen short passt.
 
  • Gefällt mir
Reaktionen: nciht
passt, so viel bekomme ich noch hin
 
Ich hatte hier ebenfalls was zusammen geschrieben was sich dann allerdings ebenso leider als nicht performant herausgestellt hat und nur für Würfelseiten < 10 funktioniert :D.
Ich fand nur die Idee spontan so nett auf b-adische Darstellungen von Zahlen zu setzen :D.
Code:
using StatsBase: countmap
using DataStructures: SortedDict
using Formatting: FormatSpec, fmt

dice_count = 5
dice_base = 6

# Get highest possible combination k (in base=10) and collect 0:k represented in
# base = dice_base
max_result = string(dice_base-1)^dice_count
max_as_int = parse(Int, max_result, base=dice_base)

combinations = digits.(Int, 0:max_as_int, base=dice_base, pad=dice_count)
combination_count = length(combinations)

# With base = n we get combinations 0,0,...,0 to n-1, n-1, ..., n-1, so we add
# one to each combination
combinations .|> row -> row .+= 1
result = Dict{Int16, Any}(countmap(eval_dice_roll.(combinations)))

show(stdout, "text/plain", sort(collect(result)))

# Also show relative count
map!(r -> 100*r/combination_count, values(result))

number_format = FormatSpec(">5.2f")
map!(r -> string(fmt(number_format, r), " %"), values(result))

show(stdout, "text/plain", sort(collect(result)))

#####################################

function eval_dice_roll(dice_roll)
    dices = countmap(dice_roll)
    filter!(d -> last(d) > 1, dices)
    result = 0
    for (k, v) in dices
        result += k*v
    end
    return result
end
 
  • Gefällt mir
Reaktionen: simpsonsfan und nciht
@BeBur Magst du mir verraten welche Sprache du verwendest ? ... ist für mich gerade nicht auf den ersten Blick ersichtlich.
 
Aphelon schrieb:
@BeBur Magst du mir verraten welche Sprache du verwendest ? ... ist für mich gerade nicht auf den ersten Blick ersichtlich.
Das ist wenig verwunderlich, es handelt sich um Julia, eine Sprache die relativ neu und wenig (scientific computing) bis gar nicht (überall anders) verbreitet ist.
 
  • Gefällt mir
Reaktionen: nciht
Zurück
Oben