Last active
March 10, 2024 17:01
-
-
Save Introscopia/aecdd5ff4f8832e08e08b075f602c1cb to your computer and use it in GitHub Desktop.
Statistical study for a "top X d6 out of Y >= CT" game mechanic.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
float[][] data = new float[8][5]; | |
// top 3 > N | |
//ON 2D6 | |
data[0][0] = 0; | |
data[0][1] = 0; | |
data[0][2] = 0; | |
data[0][3] = 0; | |
data[0][4] = 0; | |
//ON 3D6 | |
data[1][0] = 0.578704; | |
data[1][1] = 0.296296; | |
data[1][2] = 0.125000; | |
data[1][3] = 0.037037; | |
data[1][4] = 0.004630; | |
//ON 4D6 | |
data[2][0] = 0.868056; | |
data[2][1] = 0.592593; | |
data[2][2] = 0.312500; | |
data[2][3] = 0.111111; | |
data[2][4] = 0.016204; | |
//ON 5D6 | |
data[3][0] = 0.964506; | |
data[3][1] = 0.790123; | |
data[3][2] = 0.500000; | |
data[3][3] = 0.209877; | |
data[3][4] = 0.035494; | |
//ON 6D6 | |
data[4][0] = 0.991298; | |
data[4][1] = 0.899863; | |
data[4][2] = 0.656250; | |
data[4][3] = 0.319616; | |
data[4][4] = 0.062286; | |
//ON 7D6 | |
data[5][0] = 0.997996; | |
data[5][1] = 0.954733; | |
data[5][2] = 0.773438; | |
data[5][3] = 0.429355; | |
data[5][4] = 0.095775; | |
//ON 8D6 | |
data[6][0] = 0.999559; | |
data[6][1] = 0.980338; | |
data[6][2] = 0.855469; | |
data[6][3] = 0.531779; | |
data[6][4] = 0.134847; | |
//ON 9D6 | |
data[7][0] = 0.999906; | |
data[7][1] = 0.991719; | |
data[7][2] = 0.910156; | |
data[7][3] = 0.622822; | |
data[7][4] = 0.178260; | |
/* top 2 > N | |
//ON 2D6 | |
data[0][0] = 0.694444; | |
data[0][1] = 0.444444; | |
data[0][2] = 0.250000; | |
data[0][3] = 0.111111; | |
data[0][4] = 0.027778; | |
//ON 3D6 | |
data[1][0] = 0.925926; | |
data[1][1] = 0.740741; | |
data[1][2] = 0.500000; | |
data[1][3] = 0.259259; | |
data[1][4] = 0.074074; | |
//ON 4D6 | |
data[2][0] = 0.983796; | |
data[2][1] = 0.888889; | |
data[2][2] = 0.687500; | |
data[2][3] = 0.407407; | |
data[2][4] = 0.131944; | |
//ON 5D6 | |
data[3][0] = 0.996656; | |
data[3][1] = 0.954733; | |
data[3][2] = 0.812500; | |
data[3][3] = 0.539095; | |
data[3][4] = 0.196245; | |
//ON 6D6 | |
data[4][0] = 0.999336; | |
data[4][1] = 0.982167; | |
data[4][2] = 0.890625; | |
data[4][3] = 0.648834; | |
data[4][4] = 0.263224; | |
//ON 7D6 | |
data[5][0] = 0.999871; | |
data[5][1] = 0.993141; | |
data[5][2] = 0.937500; | |
data[5][3] = 0.736626; | |
data[5][4] = 0.330204; | |
//ON 8D6 | |
data[6][0] = 0.999976; | |
data[6][1] = 0.997409; | |
data[6][2] = 0.964844; | |
data[6][3] = 0.804908; | |
data[6][4] = 0.395323; | |
//ON 9D6 | |
data[7][0] = 0.999995; | |
data[7][1] = 0.999035; | |
data[7][2] = 0.980469; | |
data[7][3] = 0.856932; | |
data[7][4] = 0.457341; | |
*/ | |
/* top 1 > N | |
data[0][0] = 0.833333; | |
data[0][1] = 0.666667; | |
data[0][2] = 0.500000; | |
data[0][3] = 0.333333; | |
data[0][4] = 0.166667; | |
data[1][0] = 0.972222; | |
data[1][1] = 0.888889; | |
data[1][2] = 0.750000; | |
data[1][3] = 0.555556; | |
data[1][4] = 0.305556; | |
data[2][0] = 0.995370; | |
data[2][1] = 0.962963; | |
data[2][2] = 0.875000; | |
data[2][3] = 0.703704; | |
data[2][4] = 0.421296; | |
data[3][0] = 0.999228; | |
data[3][1] = 0.987654; | |
data[3][2] = 0.937500; | |
data[3][3] = 0.802469; | |
data[3][4] = 0.517747; | |
data[4][0] = 0.999871; | |
data[4][1] = 0.995885; | |
data[4][2] = 0.968750; | |
data[4][3] = 0.868313; | |
data[4][4] = 0.598122; | |
data[5][0] = 0.999979; | |
data[5][1] = 0.998628; | |
data[5][2] = 0.984375; | |
data[5][3] = 0.912209; | |
data[5][4] = 0.665102; | |
data[6][0] = 0.999996; | |
data[6][1] = 0.999543; | |
data[6][2] = 0.992188; | |
data[6][3] = 0.941472; | |
data[6][4] = 0.720918; | |
data[7][0] = 0.999999; | |
data[7][1] = 0.999848; | |
data[7][2] = 0.996094; | |
data[7][3] = 0.960982; | |
data[7][4] = 0.767432; | |
*/ | |
int W = 120; | |
int H = 80; | |
size( 1080, 480 ); | |
textSize(32); | |
textAlign( CENTER, CENTER ); | |
for (int i = 0; i < 8; ++i ){ | |
fill( 0 ); | |
text( (i+2)+"d6", (i+1.5)*W, H/2 ); | |
for (int j = 0; j < 5; ++j ){ | |
if(data[i][j] < 0.5 ) fill( lerpColor( #F0492C, #EFF02C, data[i][j] * 2 ) ); | |
else if(data[i][j] >= 0.5) fill( lerpColor( #EFF02C, #2CF044, (data[i][j]-0.5)*2 )); | |
rect( (i+1)*W, (j+1)*H, W, H ); | |
fill( 0 ); | |
String str = nf(data[i][j] * 100, 1,1) + "%"; | |
if( data[i][j] > 0.999 ) str = "99.9%"; | |
text( str, (i+1.5)*W, (j+1.5)*H ); | |
} | |
} | |
fill( 0 ); | |
for (int j = 0; j < 5; ++j ){ | |
text( (j+2)+"", W/2, (j+1.5)*H ); | |
} | |
save("output.png"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <time.h> | |
#include <math.h> | |
#include <string.h> | |
#include <stdarg.h> | |
#include "multidimensional.h" | |
/* "MAXIMUM GREATER THAN" */ | |
int max_arg (int n, ...){ | |
int i, max; | |
va_list vl; | |
va_start(vl,n); | |
max = va_arg(vl,int); | |
for (int i = 1; i < n; i++){ | |
int val = va_arg(vl,int); | |
max = (max > val)? max : val; | |
} | |
va_end(vl); | |
return max; | |
} | |
int compare_ints (const void * a, const void * b){ | |
return ( *(int*)a - *(int*)b ); | |
} | |
#define RESET() for (int i = 0; i < 5; ++i ) at_least[i] = 0; | |
#define COUNT(N) if( a[N-1] >= 2 ) at_least[0] += 1; \ | |
if( a[N-1] >= 3 ) at_least[1] += 1; \ | |
if( a[N-1] >= 4 ) at_least[2] += 1; \ | |
if( a[N-1] >= 5 ) at_least[3] += 1; \ | |
if( a[N-1] >= 6 ) at_least[4] += 1; | |
#define COUNT_TOP2(N) if( a[N-2] >= 2 && a[N-1] >= 2 ) at_least[0] += 1; \ | |
if( a[N-2] >= 3 && a[N-1] >= 3 ) at_least[1] += 1; \ | |
if( a[N-2] >= 4 && a[N-1] >= 4 ) at_least[2] += 1; \ | |
if( a[N-2] >= 5 && a[N-1] >= 5 ) at_least[3] += 1; \ | |
if( a[N-2] >= 6 && a[N-1] >= 6 ) at_least[4] += 1; | |
#define COUNT_TOP3(N) if( a[N-3] >= 2 && a[N-2] >= 2 && a[N-1] >= 2 ) at_least[0] += 1; \ | |
if( a[N-3] >= 3 && a[N-2] >= 3 && a[N-1] >= 3 ) at_least[1] += 1; \ | |
if( a[N-3] >= 4 && a[N-2] >= 4 && a[N-1] >= 4 ) at_least[2] += 1; \ | |
if( a[N-3] >= 5 && a[N-2] >= 5 && a[N-1] >= 5 ) at_least[3] += 1; \ | |
if( a[N-3] >= 6 && a[N-2] >= 6 && a[N-1] >= 6 ) at_least[4] += 1; | |
#define PRINTFULL(N) printf("ON %dD6\n", N);\ | |
total = powf(6,N);\ | |
for (int i = 0; i < 5; ++i ){\ | |
printf("at least %d: %d/%g = %.6f\n", i+2, at_least[i], total, at_least[i]/total );\ | |
} | |
#define PRINTOUT(N) printf("//ON %dD6\n", N);\ | |
total = powf(6,N);\ | |
for (int i = 0; i < 5; ++i ){\ | |
printf("data[%d][%d] = %.6f;\n", N-2, i, at_least[i]/total );\ | |
} | |
int main(int argc, char const *argv[]){ | |
int at_least [5] = {0,0,0,0,0};// number of times in the series when the max roll is > i+2 | |
//int N_at_least [5] = {0,0,0,0,0};// | |
float total = 0; | |
for (int i0 = 1; i0 <= 6; ++i0 ){ | |
if( i0 >= 2 ) at_least[0] += 1; | |
if( i0 >= 3 ) at_least[1] += 1; | |
if( i0 >= 4 ) at_least[2] += 1; | |
if( i0 >= 5 ) at_least[3] += 1; | |
if( i0 >= 6 ) at_least[4] += 1; | |
} | |
puts("ON 1D6"); | |
for (int i = 0; i < 5; ++i ){ | |
printf("at least %d: %.6f\n", i+2, at_least[i]/6.0 ); | |
} | |
/* | |
RESET() | |
OPEN_2D() | |
COUNT_TOP2(2) | |
CLOSE_2D() | |
PRINTOUT(2) | |
*/ | |
RESET() | |
OPEN_3D() | |
COUNT_TOP3(3) | |
CLOSE_3D() | |
PRINTOUT(3) | |
RESET() | |
OPEN_4D() | |
COUNT_TOP3(4) | |
CLOSE_4D() | |
PRINTOUT(4) | |
RESET() | |
OPEN_5D() | |
COUNT_TOP3(5) | |
CLOSE_5D() | |
PRINTOUT(5) | |
RESET() | |
OPEN_6D() | |
COUNT_TOP3(6) | |
CLOSE_6D() | |
PRINTOUT(6) | |
RESET() | |
OPEN_7D() | |
COUNT_TOP3(7) | |
CLOSE_7D() | |
PRINTOUT(7) | |
RESET() | |
OPEN_8D() | |
COUNT_TOP3(8) | |
CLOSE_8D() | |
PRINTOUT(8) | |
RESET() | |
OPEN_9D() | |
COUNT_TOP3(9) | |
CLOSE_9D() | |
PRINTOUT(9) | |
return 0; | |
} | |
/* | |
ON 1D6 | |
at least 2: 0.833333 | |
at least 3: 0.666667 | |
at least 4: 0.500000 | |
at least 5: 0.333333 | |
at least 6: 0.166667 | |
ON 2D6 | |
at least 2: 35/36 = 0.972222 | |
at least 3: 32/36 = 0.888889 | |
at least 4: 27/36 = 0.750000 | |
at least 5: 20/36 = 0.555556 | |
at least 6: 11/36 = 0.305556 | |
ON 3D6 | |
at least 2: 215/216 = 0.995370 | |
at least 3: 208/216 = 0.962963 | |
at least 4: 189/216 = 0.875000 | |
at least 5: 152/216 = 0.703704 | |
at least 6: 91/216 = 0.421296 | |
ON 4D6 | |
at least 2: 1295/1296 = 0.999228 | |
at least 3: 1280/1296 = 0.987654 | |
at least 4: 1215/1296 = 0.937500 | |
at least 5: 1040/1296 = 0.802469 | |
at least 6: 671/1296 = 0.517747 | |
ON 5D6 | |
at least 2: 7775/7776 = 0.999871 | |
at least 3: 7744/7776 = 0.995885 | |
at least 4: 7533/7776 = 0.968750 | |
at least 5: 6752/7776 = 0.868313 | |
at least 6: 4651/7776 = 0.598122 | |
ON 6D6 | |
at least 2: 46655/46656 = 0.999979 | |
at least 3: 46592/46656 = 0.998628 | |
at least 4: 45927/46656 = 0.984375 | |
at least 5: 42560/46656 = 0.912209 | |
at least 6: 31031/46656 = 0.665102 | |
ON 7D6 | |
at least 2: 279935/279936 = 0.999996 | |
at least 3: 279808/279936 = 0.999543 | |
at least 4: 277749/279936 = 0.992188 | |
at least 5: 263552/279936 = 0.941472 | |
at least 6: 201811/279936 = 0.720918 | |
ON 8D6 | |
at least 2: 1679615/1679616 = 0.999999 | |
at least 3: 1679360/1679616 = 0.999848 | |
at least 4: 1673055/1679616 = 0.996094 | |
at least 5: 1614080/1679616 = 0.960982 | |
at least 6: 1288991/1679616 = 0.767432 | |
ON 9D6 | |
at least 2: 10077695/1.00777e+007 = 1.000000 | |
at least 3: 10077184/1.00777e+007 = 0.999949 | |
at least 4: 10058013/1.00777e+007 = 0.998047 | |
at least 5: 9815552/1.00777e+007 = 0.973988 | |
at least 6: 8124571/1.00777e+007 = 0.806193 | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef MULTIDIMENSIONAL_H_INCLUDED | |
#define MULTIDIMENSIONAL_H_INCLUDED | |
#define OPEN_2D() for (int i0 = 1; i0 <= 6; ++i0 ){\ | |
for (int i1 = 1; i1 <= 6; ++i1 ){\ | |
int a [2] = {i0, i1 };\ | |
qsort( a, 2, sizeof(int), compare_ints ); | |
#define CLOSE_2D() }} | |
#define OPEN_3D() for (int i0 = 1; i0 <= 6; ++i0 ){\ | |
for (int i1 = 1; i1 <= 6; ++i1 ){\ | |
for (int i2 = 1; i2 <= 6; ++i2 ){\ | |
int a [3] = {i0, i1, i2 };\ | |
qsort( a, 3, sizeof(int), compare_ints ); | |
#define CLOSE_3D() }}} | |
#define OPEN_4D() for (int i0 = 1; i0 <= 6; ++i0 ){\ | |
for (int i1 = 1; i1 <= 6; ++i1 ){\ | |
for (int i2 = 1; i2 <= 6; ++i2 ){\ | |
for (int i3 = 1; i3 <= 6; ++i3 ){\ | |
int a [4] = {i0, i1, i2, i3 };\ | |
qsort( a, 4, sizeof(int), compare_ints ); | |
#define CLOSE_4D() }}}} | |
#define OPEN_5D() for (int i0 = 1; i0 <= 6; ++i0 ){\ | |
for (int i1 = 1; i1 <= 6; ++i1 ){\ | |
for (int i2 = 1; i2 <= 6; ++i2 ){\ | |
for (int i3 = 1; i3 <= 6; ++i3 ){\ | |
for (int i4 = 1; i4 <= 6; ++i4 ){\ | |
int a [5] = {i0, i1, i2, i3, i4 };\ | |
qsort( a, 5, sizeof(int), compare_ints ); | |
#define CLOSE_5D() }}}}} | |
#define OPEN_6D() for (int i0 = 1; i0 <= 6; ++i0 ){\ | |
for (int i1 = 1; i1 <= 6; ++i1 ){\ | |
for (int i2 = 1; i2 <= 6; ++i2 ){\ | |
for (int i3 = 1; i3 <= 6; ++i3 ){\ | |
for (int i4 = 1; i4 <= 6; ++i4 ){\ | |
for (int i5 = 1; i5 <= 6; ++i5 ){\ | |
int a [6] = {i0, i1, i2, i3, i4, i5 };\ | |
qsort( a, 6, sizeof(int), compare_ints ); | |
#define CLOSE_6D() }}}}}} | |
#define OPEN_7D() for (int i0 = 1; i0 <= 6; ++i0 ){\ | |
for (int i1 = 1; i1 <= 6; ++i1 ){\ | |
for (int i2 = 1; i2 <= 6; ++i2 ){\ | |
for (int i3 = 1; i3 <= 6; ++i3 ){\ | |
for (int i4 = 1; i4 <= 6; ++i4 ){\ | |
for (int i5 = 1; i5 <= 6; ++i5 ){\ | |
for (int i6 = 1; i6 <= 6; ++i6 ){\ | |
int a [7] = {i0, i1, i2, i3, i4, i5, i6 };\ | |
qsort( a, 7, sizeof(int), compare_ints ); | |
#define CLOSE_7D() }}}}}}} | |
#define OPEN_8D() for (int i0 = 1; i0 <= 6; ++i0 ){\ | |
for (int i1 = 1; i1 <= 6; ++i1 ){\ | |
for (int i2 = 1; i2 <= 6; ++i2 ){\ | |
for (int i3 = 1; i3 <= 6; ++i3 ){\ | |
for (int i4 = 1; i4 <= 6; ++i4 ){\ | |
for (int i5 = 1; i5 <= 6; ++i5 ){\ | |
for (int i6 = 1; i6 <= 6; ++i6 ){\ | |
for (int i7 = 1; i7 <= 6; ++i7 ){\ | |
int a [8] = {i0, i1, i2, i3, i4, i5, i6, i7 };\ | |
qsort( a, 8, sizeof(int), compare_ints ); | |
#define CLOSE_8D() }}}}}}}} | |
#define OPEN_9D() for (int i0 = 1; i0 <= 6; ++i0 ){\ | |
for (int i1 = 1; i1 <= 6; ++i1 ){\ | |
for (int i2 = 1; i2 <= 6; ++i2 ){\ | |
for (int i3 = 1; i3 <= 6; ++i3 ){\ | |
for (int i4 = 1; i4 <= 6; ++i4 ){\ | |
for (int i5 = 1; i5 <= 6; ++i5 ){\ | |
for (int i6 = 1; i6 <= 6; ++i6 ){\ | |
for (int i7 = 1; i7 <= 6; ++i7 ){\ | |
for (int i8 = 1; i8 <= 6; ++i8 ){\ | |
int a [9] = {i0, i1, i2, i3, i4, i5, i6, i7, i8 };\ | |
qsort( a, 9, sizeof(int), compare_ints ); | |
#define CLOSE_9D() }}}}}}}}} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment