Skip to content

Instantly share code, notes, and snippets.

@Introscopia
Last active March 10, 2024 17:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Introscopia/aecdd5ff4f8832e08e08b075f602c1cb to your computer and use it in GitHub Desktop.
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.
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");
#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
*/
#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