You mean you don't always round down in D&D?
AKA, yes it looks like I was accidentally using integer math.
The real numbers:
15.6627465
14.1746176
12.9559838
11.76172
10.4118873
8.5048237
When @
Oofta did this work, I began thinking about whether you could analyze the situation fully, enumerating all possibilities, instead of sampling. Since the number of sequences of 24 d6 rolls is 6^24, which is just a bit less than 3x10^18, the answer would seem to be ‘no’, at least for brute force. However, I realized there was a way to cut the problem down quite a bit. Details are below for those interested, but the result was that I was able to calculate the frequencies/probabilities of stat arrays rolled as 6 x 4d6k3 with various properties, particularly how they relate to point buy. This is the first batch of results; I have a few more things planned. Suggestions are welcome.
The top level bucketing that I did just summarizes how the stat arrays generated by 6 x 4d6k3 will generally fall with respect to whether you can directly compare them using the standard point-buy scheme at all. It’s not ideal, but the best that I could think of.
[TABLE="class: grid, width: 600"]
[TR]
[TD]
Arrays in which the values are[/TD]
[TD]
Frequency[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]
Some < 8; All < = 15[/TD]
[TD]14.5%[/TD]
[TD]Out of range low[/TD]
[/TR]
[TR]
[TD]
All >= 8; All <= 15[/TD]
[TD]28.8%[/TD]
[TD]In range[/TD]
[/TR]
[TR]
[TD]
All >= 8; Some > 15[/TD]
[TD]41.5%[/TD]
[TD]Out of range high[/TD]
[/TR]
[TR]
[TD]
Some < 8; Some > 15[/TD]
[TD]15.3%[/TD]
[TD]Out of range low and high[/TD]
[/TR]
[/TABLE]
For those that were in the 8/15 range, I further broke them down by point-buy value. The whole list is in the attached spreadsheet, but here are a few points that I thought were interesting.
- The most frequent point-buy value is 26 (1.76%); above and below 26, the frequencies gradually decrease. 25 points is at 1.75% and 27 points is at 1.73%.
- The total frequency for 0-27 points is 16.8%; 27-54 points is 12.0%.
- The mean point-buy value is 26.25.
Next, I plan to a) compute distributions for ranked values (highest value in array, 2
nd highest, etc.); and b) invent some extended point-buy scheme that can assign a point-buy value to all possible arrays (to induce comparability).
Oh, I just happened to look back at the first page of the thread and see that @
Oofta did some analysis for which he invented some point-buy scheme for all of 3-18. I had forgotten that.
In the meantime, so as to ensure that the enlightened back and forth in this thread continues, I will note that at 1.73%, the arrays corresponding to exactly 27 points come up rather rarely. This underscores that (take your pick)
- Point buy greatly restricts the wide variety of concepts that rolling allows.
- Rolling produces a lot of results that are quite uneven.
Something for everyone.
Computational notes
[sblock]The basic observation is not all that deep. Since we are interested in properties of the stat arrays, not the underlying rolls, it would suffice to just analyze each of the possible stat arrays if we knew each one’s frequency/probability. But the frequencies are actually pretty straightforward to compute. Several others in the thread have already displayed calculations of the frequency distribution of values generated by a single 4d6k3 roll. Since (we assume) the 6 rolls for a stat array are independent, the frequency of a particular array is just the product of the frequencies of its individual elements. Given the frequency of each stat array, the frequency of some property (such as having a particular point-buy value), is just the sum of the frequencies of the arrays having that property.
Alternatively, since all 4d6 rolls (as sequences) are equally likely, you can think of the problem in terms of counting and make similar observations. We know the number of 4d6k3 rolls that map to each value, and for each particular stat array, the number of 6 x 4d6k3 rolls that produce it is just the product of the number of individual 4d6k3 rolls that produce each of its constituent values. And then the number of 6 x 4d6k3 rolls that have a particular property is the sum of the numbers of rolls that produce the individual arrays having that property.
And in fact, counting was how I conceived of the problem initially. However, computationally, that counting can involve some fairly large numbers. In fact, in an interesting (or not) coincidence, that number of distinct 6 x 4d6 rolls mentioned above, 24^6, turns out to be just a little bit shy of the largest number that can be represented in a 64-bit integer. So, since I didn’t want to have worry about massaging my arithmetic to ensure that values stayed in bounds, and since the results really need to be converted to frequencies in the end for interpretability anyway, I coded it in terms of frequency calculations using floating-point, because, after all, what’s a little round-off error between friends. (Actually, I did check by adding back together frequencies that should sum to 1, and still got more than 10 nines, so I think things are pretty much ok.)
Anyway, even using that basic observation, things still could have gone amiss, as it was not immediately clear that enumerating all possible stat arrays was going to be feasible. However, 3 to 18, inclusive, is 16 values and 16^6 is ‘only’ 16,777,216 – not that many more than the 10,000,000 @
Oofta used for sampling. And in fact, just enumerating them turned out to be nearly instantaneous. Putting in the 6 floating-point multiplications for each array (to compute its frequency) did bog things down a bit – about a 5 second pause. The bits of code for analysis are just comparisons and additions and adding them in didn’t seem to hurt too much. So in the end, this seems to walk right up to but not overstep feasibility, at least for my desktop.[/sblock]