For those interested, hopefully this can stick around until we have an actual system to use it with...assuming that in SR4 the 6's "explode" indefinately (i hope they do).

I wrote some code to empirically determining the probabilities of each number of successes across a range of dice rolled. I haven't done the theoritical formulas yet, but when someone does these numbers can be used as a validation check. The code, slapped together and poorly commented, was written in VBA. Check the spoiler if you want to read it to confirm my algorithms:

[ Spoiler ]

CODE |

' global variable, because i'm lazy Dim iCountRerolls As Integer Function RollItAll() Dim i As Integer ' test the results from 1 die through 12 die For i = 1 To 12 ' 1 million rolls Call MultiRollExplodingSixes_TN5(1000000, i) Next i End Function Function MultiRollExplodingSixes_TN5(iRolls As Long, iNumberOfDice As Integer) As Double Dim i As Long Dim iTotalSuccesses As Long Dim iTotalRerolls As Long Dim iMaxSuccesses As Integer ' hopefully 100 is big enough for the array, otherwise it will resize Dim aSuccessDistribution(0 To 100) As Long For i = 1 To iRolls iSuccesses = RollExplodingSixes_TN5(iNumberOfDice) iTotalSuccesses = iTotalSuccesses + iSuccesses If iMaxSuccesses < iSuccesses Then If iSuccesses > 100 Then MsgBox "More than 100 successes in a single roll, truncating to 100 successes." iSuccesses = 100 End If iMaxSuccesses = iSuccesses End If aSuccessDistribution(iSuccesses) = aSuccessDistribution(iSuccesses) + 1 iTotalRerolls = iTotalRerolls + iCountRerolls Next i ' header for number of dice Debug.Print "Dice Rolled", iNumberOfDice Debug.Print "" Debug.Print "Successes", "% of Rolls" ' distribution of # of successes, as fraction of total rolls For i = 0 To iMaxSuccesses Debug.Print i, 100 * (aSuccessDistribution(i) / iRolls) Next i 'average number of success per roll Debug.Print "Average # successes", (iTotalSuccesses / iRolls) 'average number of times dice picked up for reroll Debug.Print "Average # of rerolls occurs per initial roll", (iTotalRerolls / iRolls) Debug.Print "--------------------" ' also return the average MultiRollExplodingSixes_TN5 = iTotalSuccesses / iRolls End Function Function RollExplodingSixes_TN5(iNumberOfDice As Integer) As Integer iCountRerolls = 0 RollExplodingSixes_TN5 = CountSuccesses(iNumberOfDice) End Function Function CountSuccesses(iNumberOfDice As Integer) As Integer Dim i As Integer Dim iSuccesses As Integer Dim iExploding As Integer Dim iRoll As Integer For i = 1 To iNumberOfDice iRoll = Int(Rnd * 6) If iRoll > 3 Then iSuccesses = iSuccesses + 1 If iRoll > 4 Then iExploding = iExploding + 1 End If End If Next i If iExploding > 0 Then iCountRerolls = iCountRerolls + 1 iSuccesses = iSuccesses + CountSuccesses(iExploding) End If CountSuccesses = iSuccesses End Function |

You kick it off by entering "=RollItAll()" in a cell in Excel (the code should likely work in Word too, or VB itself). The results are output, via the Debug object, to the Immediate window.

I also included an count of number of times the player will have to pick out the 6's and roll the smaller subset again. I didn't break it down, just gave it as an average along with the average number of successes.

The next post in this thread contains the outpt from a sample run. I ran the code using 1,000,000 rolls for each of the dice "pool" sizes. I don't have a T table handy, but I'm guessing that 1 million rolls should at the very least get the deviation from theoretcial values down to +/- 0.1% on each of the "% of Rolls" values.