PDA

View Full Version : Math question

2012-01-31, 06:28 AM
Hello!
I need a little help from the math geeks to compute the average for this:

Roll [X] [K]sided dice, keep the best [N].
For any value of X, K, N.

So, 4d6b3 is an example of this formula (incidentally it is also the typical 3.5 chargen algorithm), and it averages, to my knowledge, around 12.

I'm not really interested in numeric solutions (i.e. run a simulation 10^6 times, take the average), I can do that myself. I'd like to know how to find the formula for the averages.

Kolonel
2012-01-31, 03:00 PM
Not a big help, but:

I think you should approach this problem by changing it to a subtraction:
avg(4d6b3) = avg(4d6) - avg(min(4d6))
The average of the 4d6 sum, minus the average of the minimum die. (Or dice in other cases.)

The average of XdK is easy to find: (smallest result+largest result) / 2.

Only the average (sum) of the minimal die (dice) remains, which I don't know, but you should be able to find a formula for "sum of Y minimal values of X variables with dK (Uni(1;K)) distribution" somewhere.

Salanmander
2012-01-31, 03:43 PM
Not a big help, but:

I think you should approach this problem by changing it to a subtraction:
avg(4d6b3) = avg(4d6) - avg(min(4d6))

I'm not convinced that average is linear like that. Is avg(4d6) - avg(min(4d6)) = avg(4d6 - min(4d6))?

So, if you think of the 2d6 case, you can clearly find the probability distribution for the highest die, or the lowest die, simply by enumerating the possibilities. If there's a way to do that analytically, I suspect you can expand it to XdK, and then get the probability distribution for the 2nd highest, etc.

HMS Invincible
2012-01-31, 03:46 PM
The lazy way is to simulate the results a bunch of times on excel or some statistical software. But if you access to that, might as well ask your professor.

Siosilvar
2012-01-31, 03:54 PM
I use this (http://anydice.com/program/115) to simulate it. Change the numbers around as you want; it's currently at 4d6b3. I'm not aware of any real formula.

A quick Google gives me this:
For n dice, d sides, dropping k, and l is the highest roll that you drop, r is anything else you drop, and u is the number of dice that are showing the number l:

1/n^d * [the sum over l = 1...r of the sum over r = 0...k-1 of the sum over u = 1..n - r of (n over r) * ((n - r) over u) * (l - 1)^r * (l*(u - (k - r)) + (n - u - r) * ((d + 1) * d / 2 - (l + 1) * l / 2)].

Found here (http://www.enworld.org/forum/general-rpg-discussion/56352-5d6-drop-lowest-two-math.html).

EDIT:
I'm not convinced that average is linear like that. Is avg(4d6) - avg(min(4d6)) = avg(4d6 - min(4d6))?Some quick simulation testing with AnyDice (linked to above) tells me that those two do in fact have the same average. They don't have the same range of values or standard deviation, but they do end up with the same average. Test it yourself (http://anydice.com/program/e0b); change N to whatever you want.

Manateee
2012-01-31, 05:19 PM
Because I'm incredibly lazy, I'd just plug the Probability 101 method (sum the products of population and probabilities) into R.

poss<-matrix(nr=6^4, nc=4)
for (i in 1:4){
poss[,i]<-rep(1:6, 6^(i-1), each=6^(4-i))
}
roll<-matrix(nr=6^4, nc=1)
for (i in 1:6^4){
roll[i,]<-sum(poss[i,])-min(poss[i,])
}
sum(roll*6^-4)
So 4d6 best 3:

> sum(roll*6^-4)
 12.2446

edit:
Coming back to this thread, you're looking for a generalized formula.
Just transforming the R code into a generalizable function:

XdKbN<-function(x,k,n){
if(x<n) return("ERROR: N>X")
poss<-matrix(nr=k^x, nc=x)
for (i in 1:x) poss[,i]<-rep(1:k, k^(i-1), each=k^(x-i))
roll<-matrix(nr=k^x, nc=1)
for (i in 1:k^x){
if(x>n) roll[i,]<-sum(poss[i,])-sum(sort(poss[i,])[1:(x-n)])
if(x==n) roll[i,]<-sum(poss[i,])
}
sum(roll*k^(-1*x))
}Then just checking the formula, it looks good:

> XdKbN(x=4,k=6,n=3)
 12.2446
> XdKbN(x=2,k=4,n=2)
 5
> XdKbN(x=5,k=3,n=8)
 "ERROR: N>X"
> XdKbN(x=5,k=3,n=2)
 5.358025
EDIT EDIT:
Oh, and a bit of a warning: I might be able to think of a less efficient/more computationally intensive method here, but I'd have to sit down and think about it. This should work great for low numbers, but watch out when you start looking at things like 5d20 or 3d100.

Binks
2012-01-31, 05:48 PM
Hmm. Let's see what we can do.

*Standard I am not a mathematician I just play one on the internet disclaimer*.

To get the average we need to get the total of all possibilities (after taking the best N, which can be done by subtracting the lowest result). We then divide by the number of possibilities, K^N in this case. Doing this for an arbitrary set of dice should be possible, therefore, by finding a formula that gives us, for any values of K,X, and N, the following information:
1. What is the sum for the ith possible combination of rolls and
2. What is the lowest result in the ith possible combination of rolls.

The ideal formula would be one that generated a unique permutation for each possible result of rolling the X dice. It just so happens that such a formula exists, and is pretty easy to think of (just very hard to write out as a mathematical formula, so I'll got with an analogy for how to derive it).

Imagine, if you will, counting from 1 to some arbitrary value in base 6 with 4 significant digits (assuming I'm using that term right). It would look something like:
0000,0001,0002,0003,0004,0005,0010,0011,0012,0013, 0014,0015,0100,0101 etc.
Now imagine adding 1 to each of those digits, ie:
1111,1112,1113,1114,1115,1116,1121,1122,1123,1124, 1125,1126,1211,1212 etc.
Does that remind you of anything? Say, for instance, the possible permutations of 4d6? Counting in Base K with X digits and adding 1 to each digit nets us a nice series of all possible values for XdK, a series we can make use of.

With that information in hand we move on to dropping the worst (X-N), or keeping the best N results. If we treat each digit as a member of an array (111 = [1,1,1] etc) we can just remove the minimum value in the array (X-N) times then sum the array to get the best N results for that combination of die rolls.

Obviously this is a lot of steps to go through, and not a formula, but it's a start I suppose. I can't figure out how to make a mathematical formula out of all of that, but it's easily made into a java program (or any other programming language of your choice, would have loved to do it in python but don't have it on this machine).

import java.util.Scanner;

public class Dieaverage
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);

System.out.print("X = ");
int X = scan.nextInt();
System.out.print("K = ");
int K = scan.nextInt();
System.out.print("N = ");
int N = scan.nextInt();

double sum = 0, number = Math.pow(K, X), ik;
int[] res = new int[X];
int min, minloc;
System.out.println(number);

for (int i=0; i<number; i++)
{
// Get the Number
// DOES NOT WORK FOR K > 9. NEED TO FIND ANOTHER WAY TO DO THIS.
ik = Integer.parseInt(Integer.toString(i, (K+1)), 10);
// Convert it to an array
for (int v=0; v<X; v++)
res[v] = (int) (Math.floor((ik/Math.pow(10,(X-v-1)))%10)+1);
// Drop the bottom X-N results
for (int v2=0; v2<X-N; v2++)
{
// Min will get set to the first result
min = K+1;
minloc = 0;
for (int v=0; v<X; v++)
{
if (res[v] < min && res[v] != 0)
{
min = res[v];
minloc = v;
}
}
res[minloc] = 0;
}
for (int v=0; v<X; v++)
sum += res[v];
}
System.out.println("Average: "+(sum/number));
}
}

I'm about 80% certain that works. I tried it for known values (1d6 best 1 yielded 3.5, 1d10 best 1 yielded 5.5, 4d6b3 yielded ~12.5, so it looks ok) and the other results I tried looked right, but I can't be certain. Also it doesn't work for die sizes above 9 yet (there's a comment in there noting the line that has an issue, something to work on later).

Hopefully someone more mathematically inclined than myself can come along and derive a formula from this :smallbiggrin:

Jay R
2012-01-31, 06:17 PM
The general case is more than I'm willing to do, but by summing all possibilities, I found that the average of 4d6b3 is 15869/1296 = 12.24459877.

DonDuckie
2012-01-31, 07:14 PM
I wrote a simulator and tested it for standard dice(2,3,4,6,8,10,12,20) for up to 9dXb9

The code(c/c++):
the simulator:

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

//
// Gives the average of NdXbY
//
void sort(int n, long long* A)
{
int key, j;
for( int i=1 ; i<n ; i++)
{
key = A[i];
j = i-1;
while(j >= 0 && A[j] < key)
{
A[j+1]=A[j];
j--;
}
A[j+1] = key;
}
}

int main(int argc, char **argv)
{
int runs=100000, N, X, Y;

if(argc==4)
{
N = atoi(argv);
X = atoi(argv);
Y = atoi(argv);
if(Y>N || N<1 || X<1 || Y<1)
{
cout << "N X Y - Error: all values must be positive and Y cannot be larger than N." << endl;
exit(0);
}
}
else
{
cout << "Usage: ndxby <N> <X> <Y>" << endl << "gives you the average of rolling NdX and keeping the best Y" << endl;
exit(0);
}

double total=0;
long long* rolls = (long long*) malloc(N*sizeof(long long));

srand48(time(NULL));
for(int i=0; i<runs; i++)
{
for(int j=0; j<N; j++)
rolls[j] = (lrand48()%X)+1;

sort(N, rolls);
for(int k=1; k<Y; k++)
rolls += rolls[k];

total += rolls;
}
cout << N << "d" << X << "b" << Y << ": " << total/runs << endl;
free(rolls);
}
the tester:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char** argv)
{
int dice = {2,3,4,6,8,10,12,20};

int maxN=10, maxX=8, Y;
char* str = (char*) malloc(20*sizeof(char));

for(int i = 0; i<maxX; i++)
{
for(int j = 1; j<maxN; j++)
{
for(int k=1; k<=j; k++)
{
sprintf(str, "./ndxby %d %d %d", j, dice[i], k);
system(str);
}
}
}
return 0;
}

The result(360 lines:smallbiggrin:):
1d2b1: 1.49952
2d2b1: 1.74919
2d2b2: 2.99931
3d2b1: 1.87409
3d2b2: 3.37469
3d2b3: 4.49913
4d2b1: 1.93773
4d2b2: 3.62474
4d2b3: 4.93685
4d2b4: 5.99969
5d2b1: 1.96882
5d2b2: 3.78165
5d2b3: 5.2808
5d2b4: 6.46812
5d2b5: 7.49978
6d2b1: 1.98461
6d2b2: 3.87541
6d2b3: 5.53187
6d2b4: 6.87555
6d2b5: 7.98495
6d2b6: 9.00049
7d2b1: 1.99218
7d2b2: 3.92926
7d2b3: 5.70334
7d2b4: 7.20362
7d2b5: 8.43038
7d2b6: 9.49275
7d2b7: 10.4999
8d2b1: 1.99644
8d2b2: 3.96032
8d2b3: 5.81688
8d2b4: 7.45312
8d2b5: 8.81688
8d2b6: 9.95977
8d2b7: 10.9959
8d2b8: 11.9995
9d2b1: 1.99797
9d2b2: 3.97902
9d2b3: 5.89022
9d2b4: 7.63514
9d2b5: 9.13517
9d2b6: 10.3893
9d2b7: 11.4789
9d2b8: 12.4986
9d2b9: 13.501
1d3b1: 1.99955
2d3b1: 2.44301
2d3b2: 3.99741
3d3b1: 2.6656
3d3b2: 4.66213
3d3b3: 5.99737
4d3b1: 2.78855
4d3b2: 5.08374
4d3b3: 6.78723
4d3b4: 7.99772
5d3b1: 2.86401
5d3b2: 5.35581
5d3b3: 7.35324
5d3b4: 8.85752
5d3b5: 9.99214
6d3b1: 2.91029
6d3b2: 5.5404
6d3b3: 7.75847
6d3b4: 9.53727
6d3b5: 10.91
6d3b6: 12.0003
7d3b1: 2.94037
7d3b2: 5.67148
7d3b3: 8.0545
7d3b4: 10.0544
7d3b5: 11.6699
7d3b6: 12.9383
7d3b7: 13.9972
8d3b1: 2.96169
8d3b2: 5.76277
8d3b3: 8.27209
8d3b4: 10.4418
8d3b5: 12.2634
8d3b6: 13.751
8d3b7: 14.9475
8d3b8: 15.9865
9d3b1: 2.97364
9d3b2: 5.82893
9d3b3: 8.44389
9d3b4: 10.7502
9d3b5: 12.7513
9d3b6: 14.4447
9d3b7: 15.8208
9d3b8: 16.9645
9d3b9: 17.9908
1d4b1: 2.49696
2d4b1: 3.12324
2d4b2: 4.99497
3d4b1: 3.43328
3d4b2: 5.93006
3d4b3: 7.49019
4d4b1: 3.61687
4d4b2: 6.51284
4d4b3: 8.61334
4d4b4: 9.99646
5d4b1: 3.73135
5d4b2: 6.89608
5d4b3: 9.39431
5d4b4: 11.2318
5d4b5: 12.5015
6d4b1: 3.80589
6d4b2: 7.15582
6d4b3: 9.94269
6d4b4: 12.1562
6d4b5: 13.8046
6d4b6: 14.9987
7d4b1: 3.85794
7d4b2: 7.34866
7d4b3: 10.353
7d4b4: 12.8518
7d4b5: 14.8473
7d4b6: 16.3556
7d4b7: 17.5039
8d4b1: 3.89609
8d4b2: 7.49549
8d4b3: 10.6684
8d4b4: 13.3892
8d4b5: 15.6708
8d4b6: 17.4998
8d4b7: 18.901
8d4b8: 20.0053
9d4b1: 3.92282
9d4b2: 7.6028
9d4b3: 10.9106
9d4b4: 13.8128
9d4b5: 16.3107
9d4b6: 18.4094
9d4b7: 20.1006
9d4b8: 21.4194
9d4b9: 22.4923
1d6b1: 3.49882
2d6b1: 4.47486
2d6b2: 7.00127
3d6b1: 4.95806
3d6b2: 8.4604
3d6b3: 10.4998
4d6b1: 5.24547
4d6b2: 9.348
4d6b3: 12.2519
4d6b4: 14.0087
5d6b1: 5.43009
5d6b2: 9.92973
5d6b3: 13.4293
5d6b4: 15.9306
5d6b5: 17.5097
6d6b1: 5.55966
6d6b2: 10.3487
6d6b3: 14.2826
6d6b4: 17.3541
6d6b5: 19.5709
6d6b6: 21.0104
7d6b1: 5.65397
7d6b2: 10.6484
7d6b3: 14.8975
7d6b4: 18.3956
7d6b5: 21.1437
7d6b6: 23.1454
7d6b7: 24.5001
8d6b1: 5.72529
8d6b2: 10.89
8d6b3: 15.3936
8d6b4: 19.2297
8d6b5: 22.3948
8d6b6: 24.8838
8d6b7: 26.7207
8d6b8: 27.9964
9d6b1: 5.77389
9d6b2: 11.0624
9d6b3: 15.7696
9d6b4: 19.8697
9d6b5: 23.3703
9d6b6: 26.2707
9d6b7: 28.5674
9d6b8: 30.2632
9d6b9: 31.4848
1d8b1: 4.51013
2d8b1: 5.81712
2d8b2: 9.00702
3d8b1: 6.46641
3d8b2: 10.9655
3d8b3: 13.4957
4d8b1: 6.85816
4d8b2: 12.1523
4d8b3: 15.841
4d8b4: 17.9785
5d8b1: 7.11006
5d8b2: 12.9402
5d8b3: 17.4319
5d8b4: 20.5905
5d8b5: 22.4749
6d8b1: 7.29153
6d8b2: 13.4991
6d8b3: 18.5734
6d8b4: 22.4942
6d8b5: 25.2784
6d8b6: 26.9837
7d8b1: 7.42598
7d8b2: 13.9198
7d8b3: 19.4165
7d8b4: 23.922
7d8b5: 27.4197
7d8b6: 29.9218
7d8b7: 31.4932
8d8b1: 7.52675
8d8b2: 14.2444
8d8b3: 20.082
8d8b4: 25.0265
8d8b5: 29.0801
8d8b6: 32.2483
8d8b7: 34.5424
8d8b8: 36.0142
9d8b1: 7.6101
9d8b2: 14.5084
9d8b3: 20.6119
9d8b4: 25.9169
9d8b5: 30.4176
9d8b6: 34.1187
9d8b7: 37.0202
9d8b8: 39.1235
9d8b9: 40.5056
1d10b1: 5.49576
2d10b1: 7.1471
2d10b2: 11.0019
3d10b1: 7.96906
3d10b2: 13.47
3d10b3: 16.4928
4d10b1: 8.46229
4d10b2: 14.9579
4d10b3: 19.4601
4d10b4: 21.9928
5d10b1: 8.79924
5d10b2: 15.9741
5d10b3: 21.4777
5d10b4: 25.312
5d10b5: 27.5223
6d10b1: 9.02427
6d10b2: 16.6726
6d10b3: 22.8932
6d10b4: 27.6816
6d10b5: 31.0272
6d10b6: 33.0102
7d10b1: 9.19479
7d10b2: 17.1928
7d10b3: 23.9415
7d10b4: 29.4396
7d10b5: 33.6951
7d10b6: 36.6861
7d10b7: 38.4878
8d10b1: 9.32565
8d10b2: 17.607
8d10b3: 24.7768
8d10b4: 30.8268
8d10b5: 35.7708
8d10b6: 39.6035
8d10b7: 42.3267
8d10b8: 44.0042
9d10b1: 9.42804
9d10b2: 17.9289
9d10b3: 25.4364
9d10b4: 31.9477
9d10b5: 37.4419
9d10b6: 41.9472
9d10b7: 45.4521
9d10b8: 47.9581
9d10b9: 49.5371
1d12b1: 6.50273
2d12b1: 8.4934
2d12b2: 13.0105
3d12b1: 9.47591
3d12b2: 15.9797
3d12b3: 19.5064
4d12b1: 10.073
4d12b2: 17.7744
4d12b3: 23.0776
4d12b4: 26.0121
5d12b1: 10.4642
5d12b2: 18.9537
5d12b3: 25.4452
5d12b4: 29.9427
5d12b5: 32.4744
6d12b1: 10.7411
6d12b2: 19.8117
6d12b3: 27.16
6d12b4: 32.7957
6d12b5: 36.7373
6d12b6: 38.9881
7d12b1: 10.9511
7d12b2: 20.4453
7d12b3: 28.4361
7d12b4: 34.9429
7d12b5: 39.9426
7d12b6: 43.4377
7d12b7: 45.4808
8d12b1: 11.1131
8d12b2: 20.9448
8d12b3: 29.4331
8d12b4: 36.5916
8d12b5: 42.4153
8d12b6: 46.9083
8d12b7: 50.0725
8d12b8: 52.0115
9d12b1: 11.2402
9d12b2: 21.3463
9d12b3: 30.2545
9d12b4: 37.9566
9d12b5: 44.4245
9d12b6: 49.7201
9d12b7: 53.8197
9d12b8: 56.7241
9d12b9: 58.5129
1d20b1: 10.5183
2d20b1: 13.827
2d20b2: 21.0033
3d20b1: 15.4876
3d20b2: 25.9884
3d20b3: 31.512
4d20b1: 16.482
4d20b2: 28.984
4d20b3: 37.4717
4d20b4: 41.992
5d20b1: 17.1491
5d20b2: 30.9902
5d20b3: 41.497
5d20b4: 48.6707
5d20b5: 52.529
6d20b1: 17.6198
6d20b2: 32.4164
6d20b3: 44.3542
6d20b4: 53.4334
6d20b5: 59.6298
6d20b6: 63.0074
7d20b1: 17.975
7d20b2: 33.4787
7d20b3: 46.4765
7d20b4: 56.9747
7d20b5: 64.9803
7d20b6: 70.4831
7d20b7: 73.5095
8d20b1: 18.235
8d20b2: 34.2845
8d20b3: 48.131
8d20b4: 59.7325
8d20b5: 69.1098
8d20b6: 76.2613
8d20b7: 81.19
8d20b8: 84.0263
9d20b1: 18.4715
9d20b2: 34.9786
9d20b3: 49.4806
9d20b4: 61.979
9d20b5: 72.5652
9d20b6: 81.0767
9d20b7: 87.5841
9d20b8: 92.0895
9d20b9: 94.5346

Manateee
2012-01-31, 08:51 PM
A quick Google gives me this:
That hurt my head to parse.

I dug through that ENworld thread and found a better presentation.
Here it is, after editing some obvious oversights/errors:
http://img850.imageshack.us/img850/1879/quickformula.png (http://imageshack.us/photo/my-images/850/quickformula.png/)
Where
n = number of dice
d = number of sides
k = number of dice dropped

I'm going to give it a closer look later on, but that might be what you're looking for.

Also, if you're into R, that thread pointed out the absolutely amazing dice (http://cran.r-project.org/web/packages/dice/index.html) package. I do believe I'll be playing with it for the next couple of whiles.

2012-02-01, 08:06 AM
Thanks everybody for your kind attention. :)

A quick Google gives me this:
For n dice, d sides, dropping k, and l is the highest roll that you drop, r is anything else you drop, and u is the number of dice that are showing the number l:

Found here (http://www.enworld.org/forum/general-rpg-discussion/56352-5d6-drop-lowest-two-math.html).

Thanks, this is what I was searching!

XdKbN<-function(x,k,n){
if(x<n) return("ERROR: N>X")
poss<-matrix(nr=k^x, nc=x)
for (i in 1:x) poss[,i]<-rep(1:k, k^(i-1), each=k^(x-i))
roll<-matrix(nr=k^x, nc=1)
for (i in 1:k^x){
if(x>n) roll[i,]<-sum(poss[i,])-sum(sort(poss[i,])[1:(x-n)])
if(x==n) roll[i,]<-sum(poss[i,])
}
sum(roll*k^(-1*x))
}

I suppose this is Matlab, right? Unfortunately I'm not very proficient in it.

Imagine, if you will, counting from 1 to some arbitrary value in base 6 with 4 significant digits (assuming I'm using that term right). It would look something like:
0000,0001,0002,0003,0004,0005,0010,0011,0012,0013, 0014,0015,0100,0101 etc.
Now imagine adding 1 to each of those digits, ie:
1111,1112,1113,1114,1115,1116,1121,1122,1123,1124, 1125,1126,1211,1212 etc.
Does that remind you of anything? Say, for instance, the possible permutations of 4d6?

Very clever idea, thanks :)
Thanks for the code, too.

http://img850.imageshack.us/img850/1879/quickformula.png (http://imageshack.us/photo/my-images/850/quickformula.png/)
Where
n = number of dice
d = number of sides
k = number of dice dropped

I'm going to give it a closer look later on, but that might be what you're looking for.

Yes, thank you! This is perfect :)
I parsed this function from the thread pointed earlier, but this image is definately better :)

Tyndmyr
2012-02-01, 08:41 AM
How does this change if dices explode? IE, when they roll the max value, another 1k1 dice are added?

Actually important for a number of games I play, and it's remarkably hard to deduce a general formula. I can get all instances where kept dice are the same as rolled dice, but other instances are...challenging.

2012-02-02, 04:44 PM
How does this change if dices explode? IE, when they roll the max value, another 1k1 dice are added?

Actually important for a number of games I play, and it's remarkably hard to deduce a general formula. I can get all instances where kept dice are the same as rolled dice, but other instances are...challenging.
A single exploding die isn't that complicated. Let's take a d10:
Outcomes from 1 to 9 will have probability 1/10 as usual.
Instead of 10 you'll get any number from 11 to 20 with equal probabilities, which means that outcomes from 11 to 19 have probabilities 1/100 (20 means another exploding die). In essence:
An outcome of 10n+k (where k is an integer from 1 to 9 and n is any non-negative integer) has probability of 1/10^n.
Anything else can be derived from that as usual.

Manateee
2012-02-02, 05:34 PM
I haven't had a chance to even verify the previous formulas, but I'll have some free time this weekend.

Regarding the exploding dice, do the extra rolls count as additions to the first, or do they count as extra individual dice?

eg. in an exploding 3d4b2, if I roll a 2, 3 and 4, and the extra die comes up a 1, is the total 8 or 9?

Razanir
2012-02-02, 06:13 PM
@Manateee: I THINK it would be 8. What happens is this:
Roll 1- 2
Roll 2- 3
Roll 3- 4
Oh look, it's a 4! let's roll again and add to the 4
Roll 3a- 1
2, 3, 5
Minimum is 2
3 + 5 = 8

Back to the general discussion, exploding dice are easy enough when you don't try only taking the max roll. All you need is an infinite geometric sum. For XdKbN, exploding dice, there is a probability of 1/X that we roll again FOR EVERY DIE. So we add (K+1)/2 (average of one die). There's another 1/X chance. etc. etc. The initial value is (K+1)/(2*X), divide by 1-r = 1-1/X. Long math explanation short, if you're rolling XdKbN and make it exploding, add N*(K+1)/(2X-1)

And Binks, I'll work on porting that to python... just not the input parts (I'm learning the language, and haven't learned that yet)