From 6469a47f34c4e239109701bfb4256f4f41065146 Mon Sep 17 00:00:00 2001 From: "Becker A." Date: Sun, 8 Dec 2024 04:05:57 -0500 Subject: [PATCH] Post/dice math (#3) * WIP: adding post "d&d dice calculator" (part 2) * added mathjax support; moved page into folder * more content * more * finished `kdn` chapter draft * more edits * more edits * mostly finished `kdn drop highest` chapter draft * more polish * more edits * completed first draft of "how much does God hate me?" section * more content * disable global mathjax * god hath forsaken meeeeee * WIP adding section `kdn drop high m` * wrapped up draft of `kdn drop high m` * tmp * added time complexity to `kdn drop high m` * renamed post & added correct time * remove draft state --- .../posts/2024-11 dnd-dice-calc-2/index.md | 882 ++++++++++++++++++ .../2024-11 dnd-dice-calc-2/plot-1d6.png | Bin 0 -> 24762 bytes .../plot-2d6-drop-high-1.png | Bin 0 -> 24530 bytes .../2024-11 dnd-dice-calc-2/plot-2d6.png | Bin 0 -> 24469 bytes .../plot-3d6-drop-high-1.png | Bin 0 -> 27608 bytes .../2024-11 dnd-dice-calc-2/plot-3d6.png | Bin 0 -> 23855 bytes .../plot-4d6-drop-high-1.png | Bin 0 -> 24639 bytes hugo.toml | 10 + 8 files changed, 892 insertions(+) create mode 100644 content/posts/2024-11 dnd-dice-calc-2/index.md create mode 100644 content/posts/2024-11 dnd-dice-calc-2/plot-1d6.png create mode 100644 content/posts/2024-11 dnd-dice-calc-2/plot-2d6-drop-high-1.png create mode 100644 content/posts/2024-11 dnd-dice-calc-2/plot-2d6.png create mode 100644 content/posts/2024-11 dnd-dice-calc-2/plot-3d6-drop-high-1.png create mode 100644 content/posts/2024-11 dnd-dice-calc-2/plot-3d6.png create mode 100644 content/posts/2024-11 dnd-dice-calc-2/plot-4d6-drop-high-1.png diff --git a/content/posts/2024-11 dnd-dice-calc-2/index.md b/content/posts/2024-11 dnd-dice-calc-2/index.md new file mode 100644 index 0000000..9262479 --- /dev/null +++ b/content/posts/2024-11 dnd-dice-calc-2/index.md @@ -0,0 +1,882 @@ +--- +title: "D&D Dice Calculator - Math & Misfortune" +author: me +date: 2024-12-07T21:24:00-07:00 +draft: false +toc: false +images: +mathjax: true +tags: + - d&d + - coding + - python + - math + - statistics + - probability + - imnotbitter + - doesgodexist +--- + +> Is God willing to prevent evil, but not able? Then he is not omnipotent. +> +> Is he able, but not willing? Then he is malevolent. +> +> Is he both able and willing? Then whence cometh evil? +> +> Is he neither able nor willing? Then why call him God? +> +> ― Epicurus + +So I'm rolling stats for a lv. 1 warlock character. Right off the bat I didn't like this; I've played enough Fire Emblem to know that randomly-assigned stats are just a vehicle for demise. But this is what DM decreed, so I did what I was told and rolled for stats. + +The scheme that DM implemented for stat rolling was this: + +- choose a *specific* stat (one of STR, DEX, CON, INT, WIS, CHA) +- roll `4d6`, drop the lowest -> that's the value for that chosen stat +- do that for each stat once -> all of those assigned values form a *stat group* +- do ^ that whole process again to make a second stat group +- choose one of the stat groups to be your stats + +I rolled the following two stat groups: + +| STR | DEX | CON | INT | WIS | CHA | +|-----|-------|-------|-----|-----|-----| +| 17 | **5** | 14 | 14 | 15 | 9 | +| 12 | 15 | **5** | 15 | 10 | 15 | + +Both stat groups had a 5. DM said "oof, that's pretty unlucky. sorry dawg." Choosing the second group gave my warlock a decent CHA so that spells would be effective, but the 5 CON meant that at lv. 1 the character had 5 HP. That means 10 damage would be an instant perma-death. + +Obviously this was not super lucky. + +...but *how* unlucky is this, exactly? 🧐 + +In the last post I talked about the coding side of building a D&D dice probability calculator / visualization tool. In this post I want to dip into the (imo easier) math behind calculating these distributions. + +# some setup + +Before getting into the math, I want to make sure readers understand some fundamental background about probability and statistics. + +- an [*experiment*](https://en.wikipedia.org/wiki/Experiment_(probability_theory)) is a real-world process, that can be repeated, that has a well-defined set of [*outcomes*](https://en.wikipedia.org/wiki/Outcome_(probability)). E.g., rolling a `d6` is an experiment, and the outcomes are the numbers 1, 2, 3, 4, 5, and 6. +- an [*event*](https://en.wikipedia.org/wiki/Event_(probability_theory)) is a collection of outcomes. E.g., rolling an even number on a `d6` is an event, which is a collection of the outcomes \({2, 4, 6}\). +- a [*probability distribution*](https://en.wikipedia.org/wiki/Probability_distribution) (or in the case of dice rolls specifically, a [*probability mass function (PMF)*](https://en.wikipedia.org/wiki/Probability_mass_function)) is a mathematical function that takes as input a possible outcome / event, and outputs how probable it is for that result to be realized. + + For example, if a coin had a 55% change to land on heads when flipped (and a 45% of the same for tails), the PMF \(f\) would be defined as: + $$ + \begin{array}{l} + f(\text{heads}) := 0.55 \\ + f(\text{tails}) := 0.45 \\ + f(\text{anything else}) := 0 \\ + \end{array} + $$ +- [convolution](https://en.wikipedia.org/wiki/Convolution) is a mathematical operation that takes as input two N-dimensional arrays of numbers, and as output generates a third N-dimensional array. In this case, we'll use 1D-convolution to [calculate the distribution for the sum of two experiments](https://en.wikipedia.org/wiki/Convolution_of_probability_distributions) (e.g., `2d6` = `1d6` + `1d6`). + +## implementing convolution + +I mentioned in the last post that I was implementing this visualization tool in Python. One of the upsides of doing so is being able to use NumPy, which has a builtin convolution function, [`np.convolve`](https://numpy.org/doc/stable/reference/generated/numpy.convolve.html). + +The caveat here is that `np.convolve` doesn't calculate the index shifting that occurs when convolving pure mathematical functions. Because `np.convolve` operates on arrays which don't store this offset data, I had to write this mathematical property in myself. My solution was to write a Python class that bundles array data and offset data, includes a `convolve` method that calculates both of these together, and includes a `consolidate` method that behaves like function addition (truncated below): + +```python +from dataclasses import dataclass + +import numpy as np + +@dataclass(slots=True, kw_only=True) +class SequenceWithOffset: + seq: np.array + offset: int + + def convolve(self, other: SequenceWithOffset) -> SequenceWithOffset: + if len(self.seq) == 0 or len(other.seq) == 0: + # make a zero-length array with the correct dtype + seq = self.seq[:0] + other.seq[:0] + else: + seq = np.convolve(self.seq, other.seq) + return SequenceWithOffset(seq=seq, offset=self.offset + other.offset) + + def consolidate(self, other: SequenceWithOffset) -> SequenceWithOffset: + if len(self.seq) == 0: + return other.copy() + elif len(other.seq) == 0: + return self.copy() + index_low = min(self.offset, other.offset) + index_high = max( + self.offset + len(self.seq), + other.offset + len(other.seq), + ) + + seq = np.zeros( + index_high - index_low, + dtype=(self.seq[:0] + other.seq[:0]).dtype, + ) + seq[ + self.offset - index_low : self.offset + len(self.seq) - index_low + ] = self.seq + seq[ + other.offset - index_low : other.offset + len(other.seq) - index_low + ] += other.seq + + return SequenceWithOffset(seq=seq, offset=index_low) +``` + +Re: runtime complexity - unfortunately the docs aren't super clear, so I'm left to either read the source code (this is for fun I don't wanna read source code 😭), or guess. [Some research](https://fse.studenttheses.ub.rug.nl/25184/1/bCS_2021_GhidirimschiN.pdf.pdf) (and [some more](https://wangwei1237.github.io/shares/Algorithms_for_Efficient_Computation_of_Convolution.pdf)) makes guessing a little easier: + +- A naive algorithm would run in \(O(n_1 n_2)\) time. +- The [Karatsuba algorithm](https://en.wikipedia.org/wiki/Karatsuba_algorithm) runs in \(O(n^{1.58})\) time, and doesn't seem to have other obvious implementation constraints. +- There are other algorithms with better asymptotic performance (e.g. [Toom-Cook 3 @ \(O(n^{1.46})\)](https://en.wikipedia.org/wiki/Toom–Cook_multiplication)), but they also have large coefficients that might be impractical for typical NumPy users / use cases. +- There's also [a NumPy implementation for a method of convolution that utilizes FFT's](https://docs.scipy.org/doc/scipy-1.14.1/reference/generated/scipy.signal.fftconvolve.html) which runs in \(O(n\log n)\) time, but since that only works on floating-point data I elected not to use it. + - It seems like there's an analogous method of doing the FFT-enabled convolution for integers in the same \(O(n log(n))\) time, but instead using [the Number-theoretic Transform (NTT)](https://en.wikipedia.org/wiki/Discrete_Fourier_transform_over_a_ring#Number-theoretic_transform). + - However, I am under the impression that NumPy devs didn't implement this integer-specific algorithm for convolution. Mainly because the corresponding floating-point specific algorithm using the FFT has its own function, and if they *had* implemented an integer-specific NTT, I imagine it would get its own function too. And I don't see one in the docs. + - Also, from the paper cited above it seems like there are a number of complications required in the implementation to make it feasible. And it's unclear to me whether the NumPy developers would develop a complicated special-case algorithm just for integers, which I imagine is a pretty niche use case since you can just cast ints to floats. + +-> Moving forward I'll assume a conservative \(O(n^2)\) time complexity for this function, but know that this may not be the true complexity depending on implementation specifics. + +## probabilities vs. outcomes + +One small change in perspective I want to implement here: instead of thinking in terms of probability distributions, I instead want to think in terms of *outcome-count distributions*. + +So for example, let's consider the `2d6` case. There are \(6 \times 6 = 36\) different possible *outcomes*. The *events* we want to consider are the possible sums of dice values resulting from any of these 36 different outcomes; for `2d6` there are \(11\) such different events, which include all the integers from \(2\) (realized by rolling two \(1\)'s) to \(12\) (realized by rolling two \(6\)'s). I'll refer to these event values as *scores*, or *score values*. + +Now let's say we're interested in how we might roll the score value \(5\). There are 4 outcomes that result in a \(5\): \({(1, 4), (2, 3), (3, 2), (4, 1)}\). + +- in terms of *probability*, there is a \(\frac{4}{36}\) chance of rolling a \(5\) (assuming fair dice). +- in terms of *outcome counts*, there are 4 outcomes that result in a roll of \(5\): \({(1, 4), (2, 3), (3, 2), (4, 1)}\) are those outcomes. +- as long as the dice are fair, then one can convert between the two using the equation: + $$ + (\text{probability that value} = x) = \frac{(\text{# of outcomes where value} = x)}{(\text{total # of outcomes})} + $$ + +So when calculating probability distributions, I want to **first calculate an outcome-count function (OCF), and then convert that into a probability mass function (PMF) using the above equation on each event value**. + +There are a handful of advantages to doing this: + +1. Intermediate computations are all performed on integers instead of floating-point numbers. This means + - there's no rounding errors that can accumulate through the computation, + - each computer-stored number will contain more information (64-bit floating-point numbers only [have 53 bits of storage for digits](https://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating-point_format:_binary64) -> I would get more precision with a 64-bit integer), and + - any resulting values that are too large to store will generally trigger [a hardware-implemented error flag](https://en.wikipedia.org/wiki/Integer_overflow#Flags) that [is easier to respond to](https://doc.rust-lang.org/std/primitive.i64.html#method.checked_add). +1. It allows us to make some simple correctness checks. Specifically, rolling \(k\) \(n\)-sided dice always yields \(n^k\) outcomes, so any outcome-count distribution generated from rolling \(k\) \(n\)-sided dice must sum to \(n^k\) too. And if it doesn't, then the calculation must be wrong in some way. +1. It makes recursive calculations simpler. I'll discuss what I mean by this later on. + +The downside is that it can't be used to represent unfair dice, but I'm not concerned with unfair dice here, so that drawback is moot. + +## rolling `0dn` + +This is effectively the distribution for when we roll "0 dice". While this isn't practical in the real world, mathematically this gets used a lot in the upcoming calculations for recursive or iterative definitions and algorithms, so it makes sense to define it here upfront. + +The rationale is that rolling "0 dice" yields a single outcome \(()\), where the score value is the sum of "all the individual values", of which there are none, so this sum is \(0\). + +Implementing this in Python might look like this: + +```python +def roll_0dn() -> SequenceWithOffset: + return SequenceWithOffset(seq=np.ones(1, dtype=np.uint64), offset=0) +``` + +... and the time complexity for generating this trivial data is constant time, \(O(1)\). + +# calculations + +And now, finally, some math 😈 + +For each of the cases below, I want to figure out: + +1. a method for computing the experiment's OCF (which can be then turned into a PMF), written in Python, and +1. the time complexity for that computation method, in [big-O notation](https://en.wikipedia.org/wiki/Big_O_notation). + +## rolling `1dn` + +By definition, rolling one die with \(n\) sides will produce the OCF: + +$$ +f(x) = \begin{cases} +1 & \text{if } x \in [1, n] \\ +0 & \text{otherwise} +\end{cases} +$$ + +which could be implemented in Python in linear time \(O(n)\) like so: + +```python +def roll_1dn(n: int) -> SequenceWithOffset: + return SequenceWithOffset(seq=np.ones(n, dtype=np.uint64), offset=1) +``` + +Visualized, the plot for e.g. `1d6` looks like this: + +![Plot for OCF of 1d6](plot-1d6.png) + +Not super exciting, but definitions aren't really supposed to be. + +## rolling `kdn` + +For multiple dice, we can use the convolution operation mentioned above. Specifically, we can compose the OCF for `kdn` by convolving together the OCF of `1dn` with itself `k` times. + +A simple Python function for calculating `kdn` might look like this: + +```python +def roll_kdn(k: int, n: int) -> SequenceWithOffset: + _1dn = roll_1dn(n) + result = roll_0dn() + + for _ in range(k): + result = result.convolve(_1dn) + + return result +``` + +The time complexity for this algorithm depends on how long each convolution takes, which depends on the lengths of the intermediate resulting arrays: +- the length of the original array is \(n\) +- the length of each array convolved with itself \(i\) times is \(i(n-1) + 1\) +- the time complexity for convolving a length-\(n\) array with a length-\((i-1)(n-1) + 1\) array is \(O(i n^2)\) +- the time complexity for calculating all auto-convolutions is: + $$ + \begin{array}{l} + O(\sum_i^k i n^2) \\ + = O(n^2 \sum_i^k i) \\ + = O(k^2 n^2) \\ + \end{array} + $$ + +Below are some examples of what this looks like for a couple different \(k\) values: + +![Plot for OCF of 2d6](plot-2d6.png) + +![Plot for OCF of 3d6](plot-3d6.png) + +And again, to convert this OCF to a PMF we need to know the total number of outcomes possible. Since there are \(k\) dice involved and each die has \(n\) outcomes of its own, the number of total outcomes is the product of those individual totals, \(n^k\). + +### ❌ fewer convolutions doesn't actually make it faster + +A more sophisticated algorithm can leverage the binary representation of `k` to perform fewer convolutions. Specifically, the previous algorithm computed `1dn` auto-convolved `k` times, which required \(k-1\) convolutions. Instead, we can compute auto-convolutions of `1dn` for all powers of two up to `k`, then convolve the subset of those results whose powers of two sum to `k`. This involves only \(\log_2(k)\) convolutions to compute the auto-convolutions, and another at most \(\log_2(k)\) convolutions to get the final result. + +*(Ftr I didn't invent this myself; I've seen this trick used for other types of numerical calculations in other contexts.)* + +Such an algorithm in Python might look like this: + +```python +import numpy as np + +def roll_kdn(k: int, n: int) -> SequenceWithOffset: + # Calculate auto-convolutions at powers of two + auto_convs = [roll_1dn(n)] + for _ in range(1, k.bit_length()): + prev = auto_convs[-1] + auto_convs.append(prev.convolve(prev)) + + # Calculate result from auto-convolutions + result = roll_0dn() + for i, auto_conv in enumerate(k.bit_length): + ith_bit = k & (1 << i) + if ith_bit == 0: + continue + result = result.convolve(auto_conv) + + return result +``` + +Re: time complexity of this algorithm: +- the length of each auto-convolution array, for a given number of convolutions \(2^i \leq k\), is: + $$ + \begin{array}{l} + 2^i \cdot (n-1) + 1 \\ + = O(kn) + \end{array} + $$ +- calculating the auto-convolutions takes time: + $$ + \begin{array}{l} + O \left( \sum_i (2^i n)^2 \right) \\ + = O \left(n^2 \sum_i 4^i \right) \\ + = O \left(n^2 k^2 \left(1 + \frac14 + \frac1{16} + ...\right)\right) \\ + = O(n^2 k^2) + \end{array} + $$ +- the cumulative result after the \(k\)th step is (at most) the first \(k\) auto-convolutions convolved together. +- the length of the cumulative result array after the \(j\)th step, where \(2^j \leq k\), is (at most) the sum of the lengths minus \(1\) for each convolution operation: + $$ + \begin{array}{l} + \left( \sum_{i \leq j} 2^i \cdot (n-1) \right) + 1 \\ + = (n-1) \sum_{i \leq j} 2^i + 1 \\ + = (n-1) (2^{j+1} - 1) + 1 \\ + = O(nk) + \end{array} + $$ +- calculating all cumulative results, and thus the final result, takes time: + $$ + \begin{array}{l} + O \left( \sum_j (kn)^2 \right) \\ + = O \left(k^2 n^2 \left(1 + \frac14 + \frac1{16} + ...\right)\right) \\ + = O(k^2 n^2) + \end{array} + $$ + +This happens to have the same complexity as the simpler algorithm above, even though this algorithm uses fewer convolution operations. + +## rolling `kdn drop highest` + +Ahhhh. Finally. We get to the content that made me want to do this in the first place ☺️ + +To calculate this, I need to be able to map all of the outcomes to specific score events. But I can't just use the result that our previous function `roll_kdn` would generate, because not all of the outcomes in a specific `kdn` event will map to the same `kdn drop highest` event. + +For example, if I'm calculating `2d6 drop highest`, it would be tempting to try to call `roll_kdn(k=2, n=6)`, and use those outcome counts to make the new outcome counts. But in `2d6`, e.g. both of the outcomes \((1, 4)\) and \((2, 3)\) would be in the \(5\) score event, but in `2d6 drop highest` they would both count towards different score events, specifically \(1\) and \(2\), respectively. And since I'm not storing the actual outcomes themselves, just the number of outcomes for each score event, how would one know how to reassign counts from `2d6` to `2d6 drop highest`? + +So afaik, calculating `kdn drop highest` (and `drop lowest`) with convolutions only works by breaking the problem down into a bunch of smaller sub-problem distributions, calculating those OCF's, and element-wise summing all of the smaller OCF's together. The trick is how to come up with the sub-problems. + +To make this a little more tangible, I'm going to work through a specific example. + +### rolling `3d4 drop highest` + +For our tangible example, let's specifically consider \(k=3\) and \(n=4\). + +For our sub-problems, I want to individually consider the different events for how the largest dice value, e.g. \(4\), does or does not get rolled, and what score distributions correspond to those events. From those sub-distributions, I can re-map the scores to drop the highest value (i.e., \(4\)) and re-collect them into the final distribution. + +Specifically, I want to separately consider the following partition of events: + +1. all three dice roll a \(4\): + - *(there is exactly one outcome for this event - \((4, 4, 4)\))* + - one of the \(4\)'s gets dropped from the score + - the other two \(4\)'s are kept in the score + - -> the result is the single-event distribution `8` +1. exactly two of the dice (i.e., the first and second, the second and third, or the first and third) roll a \(4\), and the remaining one die rolls a lower number between \(1\) and \(3\): + - one of the \(4\)'s gets dropped from the score + - one of the \(4\)'s is kept in the score + - the other remaining die kept in the score rolls less than a \(4\), so it is effectively a `d3` + - -> the distribution is effectively that of `1d3 + 4` +1. exactly one die (i.e., the first, second, or third) rolled a \(4\), and the others rolled any other lower number between \(1\) and \(3\): + - the \(4\) gets dropped from the score + - the remaining die roll less than \(4\), so they are both effectively `d3`'s + - -> the scored result is effectively `2d3` +1. the remaining possibilities occur when *none* of the dice are \(4\)'s + - all dice roll less than \(4\), so they are effectively each a `d3` + - no dice has been designated to be dropped + - -> this is effectively the same as `3d3 drop highest` + +Note that the 1-die and 2-dice cases each have three unique orderings, while the 0-die and 3-dice cases each have one ordering. More generally, the number of orderings for a given number of fixed high dice \(i\) is [\(k\)-choose-\(i\)](https://en.wikipedia.org/wiki/Binomial_coefficient), or \(k \choose i\). + +Altogether, if we write the OCF of a distribution \(d\) as \(f_d\), then we can recursively express the OCF of `3d4 drop highest` as follows: + +$$ +\begin{align} +f_{3d4 \text{ drop highest}} (x) +&= {3 \choose 0} f_{8} (x) \\ + &+ {3 \choose 1} f_{1d3 + 4} (x) \\ + &+ {3 \choose 2} f_{2d3} (x) \\ + &+ {3 \choose 3} f_{3d3 \text{ drop highest}} (x) +\end{align} +$$ + +### back to the general case, `kdn drop highest` + +For the general case of dropping the highest die (specifically for the non-trivial cases, i.e. when there is more than one die \(k > 1\), and the die has multiple outcomes \(n > 1\)), we can formulate an equation similar to the `3d4 drop highest` case: + +$$ +f_{kdn \text{ drop highest}} (x) \\ += {k \choose k} f_{kd(n-1) \text{ drop highest}} (x) \\ + + \sum_{i \in [0, k-1]} {k \choose i} f_{id(n-1) + n \cdot (k-1 -i)} +$$ + +However, since this is a recursive definition, we have to define the end conditions for each of the decreasing parameters, \(k\) and \(n\): +- when \(k = 1\) - if we roll one die and drop "the highest" (a.k.a. "the only"), it's the same as rolling no dice: + $$ + f_{1dn \text{ drop highest}} (x) \\ + = f_{0} (x) \\ + = \begin{cases} + 1 & \text{if } x = 0 \\ + 0 & \text{otherwise} \\ + \end{cases} + $$ +- and when \(n = 1\) - if all dice can only roll a \(1\), then rolling \(k\) dice and dropping "the highest" should always result in the same value, i.e. \(k-1\): + $$ + f_{kd1 \text{ drop highest}} (x) \\ + = f_{k-1} (x) \\ + = \begin{cases} + 1 & \text{if } x = k-1 \\ + 0 & \text{otherwise} \\ + \end{cases} + $$ + +In both end cases, the OCF reduces to \(f_{k-1}\). + +With the equation established, we can now implement it in Python: + +```python +import math + +def roll_kdn_drop_highest(k: int, n: int): + if k == 1 or n == 1: + return SequenceWithOffset(seq=np.ones(1, dtype=np.uint64), offset=k-1) + + result = roll_kdn_drop_highest(k=k, n=n-1) + for i in range(k): + sub_result = roll_kdn(k=i, n=n-1) + sub_result.seq *= math.comb(k, i) + sub_result.offset += n * (k - 1 - i) + result = result.consolidate(sub_result) + return result +``` + +Some graphs of this are shown below: + +![Plot for OCF of 2d6 drop highest](plot-2d6-drop-high-1.png) + +![Plot for OCF of 3d6 drop highest](plot-3d6-drop-high-1.png) + + +Like the function itself, the complexity can also be expressed recursively. The non-recursive parts are: +- the base case at `kd1` or `1dn`, which are constant time: \(O(1)\) +- a loop from \(i=0\) to \(k-1\): \(O( \sum_{i=0}^{k-1} ... )\): + - calculating `kdn`: \(O(i^2 n^2)\) + - element-wise multiplication for \(i(n-1) + 1\) elements: \(O(in)\) + - `consolidate`, i.e. initialization and element-wise addition for at most \(k(n-1) + 1\) elements: \(O(kn)\) + +Let \(O(C(k, n))\) be the time complexity of this algorithm. Then altogether the complexity would be expressed as follows: + +$$ +\begin{align} +O(C(k, n)) :&= O\left( C(k, n-1) + \sum_{i=1}^{k-1} (i^2 n^2 + \cancel{in} + \cancel{kn}) \right) \\ + &= O\left( C(k, n-1) + n^2 \sum_{i=1}^{k-1} i^2 \right) \\ + &= O\left( C(k, n-1) + n^2 k^3 \right) \\ + \textit{apply def. of } C(k, n-1) \rightarrow &= O\left( \left( C(k, n-2) + k^3 {(n-1)}^2 \right) + k^3 n^2 \right) \\ + \textit{repeatedly apply def. of } C(k, n-j) \rightarrow &= O\left( ... + k^3 {(n-2)}^2 + k^3 {(n-1)}^2 + k^3 n^2 \right) \\ + &= O\left( k^3 \sum_{j=1}^n {(n-j)}^2 \right) \\ + &= O\left( k^3 n^3 \right) \\ +\end{align} +$$ + +### calculate all sub-distributions in advance -> better performance & complexity + +In #kdn, we showed that it takes just as much time complexity to calculate an OCF for `kdn`, as it does to calculate all OCF's of `idn` for \(i \in [1, k]\). Doing the latter explicitly in this function is significant enough that it actually improves the overall time complexity. + +The revised Python code might look like this: + +```python +def iter_autoconv(dist: SequenceWithOffset): + result = roll_0dn() + while True: + yield result + result = result.convolve(dist) + +def roll_kdn_drop_highest(k: int, n: int): + if k == 1 or n == 1: + return SequenceWithOffset(seq=np.ones(1, dtype=np.uint64), offset=k-1) + + result = roll_kdn_drop_highest(k=k, n=n-1) + for i, kdnm1 in zip(range(k), iter_autoconv(roll_1dn(n-1))): + sub_result = kdnm1.copy() # reallocates a new object & numpy array + sub_result.seq *= math.comb(k, i) + sub_result.offset += n * (k - 1 - i) + result = result.consolidate(sub_result) + return result +``` + +... for which the new time complexity would look like this: + +$$ +\begin{align} +O(C(k, n)) :&= O\left( C(k, n-1) + k^2 n^2 + \sum_{i=1}^{k-1} (in) \right) \\ + &= O\left( C(k, n-1) + k^2 n^2 + n \sum_{i=1}^{k-1} i \right) \\ + &= O\left( C(k, n-1) + k^2 n^2 + \cancel{k^2 n} \right) \\ + \textit{repeatedly apply def. of } C(k, n-j) \rightarrow &= O\left( ... + k^2 {(n-2)}^2 + k^2 {(n-1)}^2 + k^2 n^2 \right) \\ + &= O\left( k^2 \sum_{j=1}^n {(n-j)}^2 \right) \\ + &= O\left( k^2 n^3 \right) \\ +\end{align} +$$ + +So explicitly calculating the auto-convolutions of `1d(n-1)` reduces the time complexity from \(O(k^3 n^3)\) to \(O(k^2 n^3)\), which is a reduction by a factor of \(k\). + +### note re: outcome counts vs. probabilities + +So when I said "[using outcome counts] makes recursive calculations simpler", this is what I meant. + +Specifically, I wouldn't be able to use the nested recursive `kdnm1` calculations as sub-functions to calculate `roll_kdn_drop_highest`, unless I either 1) first converted each probability distribution to an outcome-count distribution before doing any aggregation, or 2) tried to use them as conditional probabilities. Doing both of these things would be annoyingly complicated. + +*(In fact, when I was first writing this code I started out using probability distributions with workaround 1), and when I got to doing the "drop highest/lowest die" functions I ran into bugs that I couldn't figure out how to fix. For me in this case, it turned out to be easier to refactor everything into using outcome counts and rewriting the function s.t. the bugs were obviated, rather than fixing whatever bugs I had.)* + +## rolling `kdn drop high m` + +The above can be further generalized to dropping the \(m\) highest dice from the score. We can reuse most the previous algorithm, i.e. do the same splitting on the different outcomes for rolling the highest die value; the main differences here will be in how we recurse and how we assign score values to sub-distributions. + +Similar to before, we have a partition of sub-distributions based on how many high values are rolled. Sub-distributions have a piecewise definition: + +- When the number of high values \(i\) is greater than (or equal to) the amount of dice to drop \(m\), then those high values are deducted from the drop count, and the remaining \(i - m\) high values contribute to the overall score: + $$ + f_{d_i \ | \ i \geq m} (x) := {k \choose i} f_{(k-i)d(n-1) + n \cdot (i-m)} (x) + $$ +- When the number of high values \(i\) is *less than* (or equal to) the amount of dice to drop \(m\), then those high values are dropped, and the remaining drop count \(m - i\) is passed on to the sub-distribution: + $$ + f_{d_i \ | \ i \leq m} (x) := {k \choose i} f_{(k-i)d(n-1) \text{ drop } (m-i)} (x) + $$ + +In both cases, the sub-problems always have a smaller \(n\) value, and sometimes have smaller \(k\) and \(m\) values. Again as in the `kdn drop highest` problem, since this is a recursive function we need to provide base case definitions so that it doesn't recurse indefinitely. Now that there is another decreasing input value \(m\) in addition to the other previous ones \(k\) and \(n\), we need *three* base cases: + +- when \(m = 0\) - this reduces to `kdn`: + $$ + f_{kdn \text{ drop high } 0} (x) \\ + = f_{kdn} (x) \\ + $$ +- when \(n = 1\) - basically the same as in `kdn drop highest`: + $$ + f_{kd1 \text{ drop high } m} (x) \\ + = f_{k-m} (x) \\ + = \begin{cases} + 1 & \text{if } x = k-m \\ + 0 & \text{otherwise} \\ + \end{cases} + $$ +- and when \(k = m\) - if we roll \(k\) dice and drop \(m\) of them, we've rolled \(0\) dice: + $$ + f_{kdn \text{ drop high } k} (x) \\ + = f_{0} (x) \\ + = \begin{cases} + 1 & \text{if } x = 0 \\ + 0 & \text{otherwise} \\ + \end{cases} + $$ + +Altogether, we can mathematically express the distribution as follows: + +$$ +\begin{align} +f_{kdn \text{ drop high } 0} (x) &= f_{kdn} (x) \\ +f_{kd1 \text{ drop high } m} (x) &= f_{k-m} (x) \\ +f_{kdn \text{ drop high } k} (x) &= f_{0} (x) \\ +f_{kdn \text{ drop high } m} (x) &= + \sum_{i=0}^{m-1} {k \choose i} f_{(k-i)d(n-1) \text{ drop } (m-i)} (x) \\ + &+ \sum_{i=m}^k {k \choose i} f_{(k-i)d(n-1) + n \cdot (i-m)} (x) +\end{align} +$$ + +A Python implementation might look like this: + +```python +def roll_kdn_drop_high(k: int, n: int, m: int) -> SequenceWithOffset: + if k == m or n == 1: + return SequenceWithOffset(seq=np.array([1], dtype=np.uint64), offset=k-m) + if m == 0: + return roll_kdn(k=k, n=n) + + result = SequenceWithOffset(seq=np.array([], dtype=np.uint64), offset=0) + for i in range(m): + sub_dist = roll_kdn_drop_high(k=k-i, n=n-1, m=m-i) + sub_dist.seq *= math.comb(k, i) + result = result.consolidate(sub_dist) + + for i in range(m, k): + sub_dist = roll_kdn(k=k-i, n=n-1) + sub_dist.seq *= math.comb(k, i) + sub_dist.offset += n * (i - m) + result = result.consolidate(sub_dist) + + return result +``` + +### caching calculated sub-distribution + +Initially I thought the above implementation was pretty good. But after implementing and playing around with different inputs, I noticed that there was a sizeable delay when calculating large drop counts. For example, running `roll_kdn_drop_high(n=20, k=7, m=6)` took a couple seconds to calculate, and increasing the input values to `k=10, m=9` took over 30 seconds. I done borked something. + +This whole issue was actually giving me flashbacks of when I was first learning to code on my own, back when I was doing Hacker Rank (effectively a LeetCode clone/ancestor) problems for fun. There were a handful of occasions where I'd write a recursive function and it would hang once the inputs got up to ~10-20 in size or magnitude. The solution: either rewrite use a non-recursive algorithm, or add in caching to the recursive definition. + +#### debugging + +But first, let's verify the problem. I took the above Python function definition and added in a print statement at the very top of the function, something like `print(f"roll {k}d{n} drop high {m}")`; this will tell me how many times the function gets re-called during recursion. Rerunning the print-augmented function call `roll_kdn_drop_high(n=20, k=7, m=6)` generated a *wall* of terminal text. I took that, dropped it into a text file, reformatted it into a Python list called `log`, where every entry in `log` was a separate `print` call, and then loaded `log` into a Python terminal. + +With the `print` calls in a Python terminal, I could do some analysis. Firstly, how many `print` calls were there? + +```pycon +>>> len(log) +407330 +``` + +That's a *lot* of calls. Potentially the recursive function was having issues terminating, but 1) if it didn't terminate, it would've kept going indefinitely, and 2) I have my intuition that the function is getting called with the same inputs repeatedly. + +What do the function call frequencies look like? + +```pycon +>>> from collections import defaultdict +>>> counts = defaultdict(int) +>>> for l in log: +... counts[l] += 1 +... +>>> counts +defaultdict(, { [A BUNCH OF ENTRIES...] }) +``` + +Ooooookay that's too much data. How many unique `print` calls were there? + +```pycon +>>> len(counts) +141 +``` + +*There*'s an issue: the function gets called \(407,330\) times, but only \(141\) of the calls are unique. So \(407,330 - 141 = 407,189\) of the function calls are redundant. + +At this point we've already identified the problem, but now I'm curious: what does the frequency distribution look like? (E.g., if there were a few specific calls that was responsible for most of the repetition, then maybe I wouldn't have to cache everything?) + +```pycon +>>> list(reversed(sorted(counts.values()))) +[42504, 42504, 33649, 33649, 26334, 26334, 20349, 20349, 15504, 15504, 11628, 11628, 8855, 8568, 8568, 7315, 6188, 6188, 5985, 4845, 4368, 4368, 3876, 3060, 3003, 3003, 2380, 2002, 2002, 1820, 1540, 1365, 1330, 1287, 1287, 1140, 1001, 969, 816, 792, 792, 715, 680, 560, 495, 462, 462, 455, 364, 330, 286, 252, 252, 220, 210, 210, 190, 171, 165, 153, 136, 126, 126, 126, 120, 120, 105, 91, 84, 78, 70, 66, 56, 56, 56, 55, 45, 36, 35, 35, 28, 21, 21, 21, 20, 20, 19, 18, 17, 16, 15, 15, 15, 14, 13, 12, 11, 10, 10, 10, 9, 8, 7, 6, 6, 6, 6, 5, 5, 4, 4, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +``` + +Okay, yeah the redundancy is *not* evenly distributed; the majority of redundancy belongs to a subset of the function calls. + +Actually, there's a simple metric to characterize this majority responsibility phenomenon, by generalizing the concept behind [the 80-20 rule](https://en.wikipedia.org/wiki/Pareto_principle) to arbitrary percentages. Specifically, I now want to ask this question: what percent \(x\) of the most-frequent unique function calls contribute to \((1-x)\)% of the total function calls? + +```python +import numpy as np + +def sparsity_factor(values) -> float: + values = sorted(values) + array_acc = np.add.accumulate([0] + values) + array_acc_percent = array_acc / array_acc[-1] + equal_acc_percent = np.linspace(0, 1, len(array_acc_percent))[::-1] + + index = np.diff(array_acc_percent >= equal_acc_percent).nonzero() + return equal_acc_percent[::-1][index] +``` + +```pycon +>>> sparsity_factor(counts.values()) +array([0.85815603]) +``` + +Okay, so ~14.2% of the most-frequent unique function calls account for ~85.8% of the total function calls. In this case it's probably still worth it to cache all of them, given the amount of effort it'd take to single-out the most intensive calls from the others. But this metric gives me a good high-level understanding of the data. + +#### the fix + +Another one of the upsides of using Python is that there are a lot of standard-library-provided solutions to common problems, and caching function calls happens to be one of those problems. For this, Python provides [`functools.lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache), which we can use in our function. However, to do so there are some refactors we need to make: +- I don't want the cache to persist after the function has finished. One way to achieve this is to make an inner function `inner`, that: + 1. is created inside the main function `roll_kdn_drop_high` + 1. is decorated with `lru_cache` + 1. is called initially by `roll_kdn_drop_high` with the provided parameters + 1. is called recursively by itself with the recursing parameters + 1. goes out of scope and gets garbage-collected (along with its `lru_cache`) on exiting `roll_kdn_drop_high` +- the \(m = 0\) case should define \(kdn\) recursively as well, so that we get the benefit of caching and reusing each step in the \(kdn\) calculation. + +Overall the refactor might look like this: + +```python +def roll_kdn_drop_high(k: int, n: int, m: int) -> SequenceWithOffset: + # make sure I don't mix up parameters from inner and outer functions + _k, _n, _m = k, n, m + del k, n, m + + # Refactor 1: move logic to inner function + @functools.lru_cache(max_size=None) + def inner(k: int, n: int, m: int): + if k == m or n == 1: + return SequenceWithOffset(seq=np.array([1], dtype=np.uint64), offset=k-m) + if m == 0: + # Refactor 2: calculate kdn with explicit recursion + if k == 0: + return roll_0dn() + if k == 1: + return roll_1dn(n) + return inner(k=1, n=n, m=0).convolve(inner(k=k-1, n=n, m=0)) + + result = SequenceWithOffset(seq=np.array([], dtype=np.uint64), offset=0) + for i in range(m): + sub_dist = inner(k=k-i, n=n-1, m=m-i).copy() + sub_dist.seq *= math.comb(k, i) + result = result.consolidate(sub_dist) + + for i in range(m, k): + sub_dist = inner(k=k-i, n=n-1, m=0).copy() + sub_dist.seq *= math.comb(k, i) + sub_dist.offset += n * (i - m) + result = result.consolidate(sub_dist) + + return result + + return inner(k=_k, n=_n, m=_m) +``` + +#### time complexity + +The time complexity for this function is a little tricky to calculate, since it's not explicitly clear as to when calls to `inner` actually invoke the defined function, or just pull from the LRU cache. To assess this, we'll have to figure out which calls are made recursively from a given set of starting input parameters \(k, n, m\), evaluate the complexity for each of those first function calls (assuming all sub-calls are cached & accounted for), and aggregate the result into an overall complexity. + +*TODO I need to do a better job of explaining how to calculate the complexity here.* + +Let's track some of the function calls: +- \(k\text{d}n \text{ dh}m\) calls: + - \(k\text{d}(n-1) \text{ dh}m\) + - \((k-1)\text{d}(n-1) \text{ dh}(m-1)\) + - ... + - \((k-m)\text{d}(n-1) \text{ dh}0 = (k-m)\text{d}(n-1)\) + - \((k-m-1)\text{d}(n-1)\) + - \((k-m-2)\text{d}(n-1)\) + - ... + - \(1\text{d}(n-1)\) +- \(k\text{d}(n-1) \text{ dh}m\) calls all the same as above, but with \((n-2)\) +- ... +- \(k\text{d}(n-i) \text{ dh}m\) calls the same as above, but with \((n-i-1)\) + +So from this, it seems like the function calls span two specific ranges of parameters: +1. calling \(k_\text{r} \text{d} n_\text{r} \text{ dh} 0\) for the parameter ranges \(n_\text{r} \in [1, n-1]\) and \(k_\text{r} \in [0, k-m]\) + - from the previous section #kdn, we know that calculating \(\{i\text{d}n \ |\ i \in [0, k]\}\) takes \(O(k^2 n^2)\) time + - -> calculating \(\{i\text{d}j \ |\ i \in [0, k-m], j \in [0, n-1]\}\) would thus take time: + $$ + \begin{align} + O \left( \sum_{j=0}^{n-1} (k-m)^2 j^2 \right) + &= O((k-m)^2 n^3) \\ + \end{align} + $$ +1. calling \((k-i) \text{d} n_\text{r} \text{ dh} (m-i)\) for the parameter ranges \(n_\text{r} \in [1, n-1]\) and \(i \in [0, m]\) + - we assume that when calculating these, all the sub-distributions have been pre-calculated and cached; technically the cached values would get copied s.t. the cached values aren't altered, and this would take linear time on the array lengths, but they're not getting computed from scratch. + - the function loops through \(k-i\) different sub-distributions: + - the first \(m-i\) sub-distributions have lengths \(((k-i) - (m-i))(n-2) + 1 = O((k-m) n)\); the function does initialization and element-wise multiplication and addition, so the time to do this work should be linear on the array length, \(O((k-m) n)\) + - the total time complexity of that loop should be: + $$ + O \left( \sum_{j=0}^{m-i} (k-m) n \right) + = O((m-i) (k-m) n) + $$ + - the last \((k-i) - (m-i) = k-m\) sub-distributions have lengths \((k-i-j)(n-2) + 1 = O((k-i-j)n)\); similarly the function does only linear work here, \(O((k-i-j)n)\) + - the total time complexity of that loop should be: + $$ + O \left( \sum_{j=m-i+1}^{k-i} (k-i-j) n \right) + = O \left( \sum_{j=0}^{k-m-1} j n \right) + = O((k-m)^2 n) + $$ + - doing this for all \(n_\text{r} \in [1, n-1], i \in [0, m]\) would take time: + $$ + \begin{align} + &O \left( \sum_{n_r=0}^{n-1} \sum_{i=0}^{m} \left( (m-i) (k-m) n_r + (k-m)^2 n_r \right) \right) \\ + &= O \left( \left( \sum_{n_r=0}^{n-1} n_r \right) \sum_{i=0}^{m} \left( (m-i) (k-m) + (k-m)^2 \right) \right) \\ + &= O \left( n^2 \sum_{i=0}^{m} \left( (m-i) (k-m) + (k-m)^2 \right) \right) \\ + &= O \left( n^2 (k-m) \left( \sum_{i=0}^{m} (m-i) + \sum_{i=0}^{m} (k-m) \right) \right) \\ + &= O \left( n^2 (k-m) \left( m^2 + m (k-m) \right) \right) \\ + &= O \left( n^2 (k-m) m \left( \cancel{m} + (k \cancel{-m}) \right) \right) \\ + &= O \left( n^2 k (k-m) m \right) \\ + \end{align} + $$ + +Totaling all of this up, the complete time complexity should be: + +$$ +\begin{align} +T_{k\text{d}n \text{ dh}m} +& = O((k-m)^2 n^3 + k m (k-m) n^2) \\ +m \in [0, k], \text{ max at } m=\frac{k}{2} \rightarrow \ +& = O(k^2 n^3 + k^3 n^2) \\ +\end{align} +$$ + +## rolling "..." and dropping the *lowest* dice + +While we could repeat the thinking and problem formulation used before for the "drop highest \(m\) dice" case in order to solve the "drop lowest \(m\) dice" case, there is a simpler solution: + +- reverse the distribution array of the input + - *(technically this is needed for calculations on generic distributions, but since dice roll distributions are symmetric it's not needed here)* +- calculate `roll_kdn_drop_high(k, d, m)` +- reverse the distribution array + +And we would get the correct result! But why? It's because there's actually a lot of symmetry in this calculation that we can take advantage of. + +So imagine if we took the *negative inversion* of our distribution (i.e., \(f_{1d(-n)}(x) = f_{1dn}(-x)\)), where all outcomes instead are comprised of negative numbers (i.e., `2d(-6)` has outcomes like \((-3, -5)\)). It's easy enough to map outcomes & events from `1d(-n)` to `1dn` and vice versa. + +Now if we used this inverted distribution to do the same calculation of dropping the "highest" values, it would instead drop the *highest negative* values in `kd(-n)`, which would correspond to the *lowest positive* values in `kdn`. + +Mathematically, we can express the above concept as follows: + +$$ +f_{k\text{d}n \text{ drop low }m} (x) = f_{k\text{d}(-n) \text{ drop high }m} (-x) +$$ + +In this way, we can reuse `roll_kdn_drop_high(k, d, m)` to calculate `roll_kdn_drop_low(k, d, m)`, without having to reformulate the previous algorithm at all: + +```python +def roll_kdn_drop_low(k: int, d: int, m: int): + result = roll_kdn_drop_high(k, d, m) + result.seq = result.seq[::-1] + return result +``` + +Note that the above Python function also takes advantage of some simplifications: +- for the case of dropping highs/lows from `kdn` specifically, since `1dn` always has a symmetric distribution, it doesn't have to be reversed in the first step. +- the offset doesn't have to change since the range of valid score events (i.e., the offset and the array length) is the same for `kdn drop high m` and `kdn drop low m`, and doing two reversals leaves the original offset unchanged. + +## refactors for working with generic distributions + +After writing Python functions like the ones described in the prior sections, I realized that they could be made even more generic. The functions I wrote that calculated distributions for repeated rolls (i.e., `roll_kdn`, `roll_kdn_drop_lowest`, etc.) didn't actually rely on any specific features of dice-roll distributions; in fact, they could be reworked to accept a generic distribution parameter and operate directly on that with few changes to the original algorithm. + +For example, `roll_kdn` was refactored into `roll_k`: + +```python +def roll_k(dist: SequenceWithOffset, k: int) -> SequenceWithOffset: + result = roll_0dn() + for _ in range(k): + result = result.convolve(dist) + return result +``` + +TODO - hopefully this communicate the gist. For more specifics, check out [the real source code](https://github.com/CrepeGoat/heart-of-the-dice/blob/v0.1.1/dice/calc.py). + +These modifications mean that we can calculate arbitrary nestings of repeated distributions with dropped high or low values. For example, calculating the distribution for the sum of rolled stats could be done by running: + +```python +roll_k(roll_k_drop_low(roll_1dn(n=6), k=4, drop=1), k=6) +``` + +which wouldn't have been possible to calculate with the code before the refactor. + +# hath god forsaken me? + +And with the above change, the calculation functions are effectively feature-complete to calculate any probability result I could want. So now, it was time for answers. + +After writing out this math & code, I opened up a Python interpreter, loaded in the code, and started running some numbers: + +```pycon +>>> from dice import calc as dc +>>> import numpy as np +``` + +- what are the odds of getting the stat sums that I got for my two stat groups? + ```pycon + >>> sum([17, 5, 14, 14, 15, 9]) + 74 + >>> sum([12, 15, 5, 15, 10, 15]) + 72 + >>> + >>> stat_sum = dc.roll_k(dc.roll_k_droplow(dc.roll_1dn(6), k=4, drop=1), k=6) + >>> stat_cdist = np.add.accumulate(stat_sum.seq) + >>> + >>> stat_cdist[74 - stat_sum.offset] / stat_cdist[-1] + np.float64(0.5507508601943684) + >>> stat_cdist[72 - stat_sum.offset] / stat_cdist[-1] + np.float64(0.4377304041567714) + ``` + -> these are the 55th and 43rd percentiles; both percentiles are within 10% of the median, the center of the distribution, which is quite close. Not lucky, not unlucky. + +- what are the chances of rolling a \(5\) or lower for a single stat? + ```pycon + >>> dc.roll_k_droplow(dc.roll_1dn(6), 4, 1) + SequenceWithOffset(seq=array([ 1, 4, 10, 21, 38, 62, 91, 122, 148, 167, 172, 160, 131, + 94, 54, 21], dtype=uint64), offset=3) + >>> (1 + 4 + 10) / (6 ** 4) + 0.011574074074074073 + ``` + -> ~1.16%, or about \(\frac{5}{432}\) *(note that this event has \(1 + 4 + 10 = 15\) outcomes; this is less likely than rolling the highest number, an 18, which has \(21\) outcomes.)* +- what are the chances of rolling a \(5\) or lower for *any* of the six stats in a stat group? + ```pycon + >>> p = 15 / (6 ** 4) + >>> 1 - (1 - p) ** 6 + 0.06746579772408667 + ``` + -> ~6.75%, about \(\frac{5}{74}\) +- what are the chances of rolling a \(5\) or lower *in both stat groups*? + ```pycon + >>> p_g = 1 - (1 - p) ** 6 + >>> p_g ** 2 + 0.004551633862547378 + ``` + **-> ~0.455%**, about \(\frac{1}{219}\) +- how unlucky is that compared to rolling a 1 with advantage? + ```pycon + >>> d20_adv = dc.roll_k_droplow(dc.roll_1dn(20), k=2, drop=1) + >>> d20_adv.seq / (20 ** 2) + array([0.0025, 0.0075, 0.0125, 0.0175, 0.0225, 0.0275, 0.0325, 0.0375, + 0.0425, 0.0475, 0.0525, 0.0575, 0.0625, 0.0675, 0.0725, 0.0775, + 0.0825, 0.0875, 0.0925, 0.0975]) + ``` + -> rolling a 5 for both stat blocks is not as bad as crit-failing with advantage (0.25%, \(\frac{1}{400}\)), but is worse than rolling a 2 with advantage (0.75%, \(\frac{3}{400}\)), which is pretty bad. + +...god dammit. diff --git a/content/posts/2024-11 dnd-dice-calc-2/plot-1d6.png b/content/posts/2024-11 dnd-dice-calc-2/plot-1d6.png new file mode 100644 index 0000000000000000000000000000000000000000..356cdf8ea861e70104b51eeda5a895b4bed74179 GIT binary patch literal 24762 zcmeFZcTiN@5mLNd}P;y3zk|hlyNist;Ac*8VLl_hZf&>A{NkJqH zAX&0Q7;+rakmjvHz3-^!+#x7=z}u>FXHH!@b?DHc zGYaz3>W2;;fgCz?xR&Sy_{p3vg&p|MVJCGt$wRqqmuC(gqCcb{eM{5bXrbzO<%OR8 z8vLz@N_B=SSFW5+Mko{a2*Ou1-kT7`c3_!o7`t07zXys}Y| znyBn{`VoH5WJ@C+qdw2x_^LjSUe665Xls1`ih8;-uH@aVLr2IS9XdvT=rKJD87Z20 ztRv0(`wtEi2_GY)eRAk9(M`hd-26gu)BTCh^BH>Z%LhLrBBeUG68wXHnwTDPOX8C= z*^j#&_6s^Db*NVA#E*NB5qTUTQu{*6OXEja1mPFZSC0N% zz%jAIeyr00@UxOXR{3Z-{O3K6JwYC-rC5_vK6&NG5^uUU{=CPLTWW{U#M@WWpZ>fR zJ;eM!Z~Bt;(ekl9vaVa--|P^0O}_uVCMngsbB*CwUZ<+WsfN;?i5d0T>(NU-g%7*g znX167Up((PyTy0L&c>DThKbe5mf5{Z&EShX$hAG!N9Vb;mCv!rUmYy5kHO>#tgoKKN0qm0zG0&C z9gr$_Ti^`3$n|_fjNj5nGm=$}yCIY&Mq+J>)UJHohx1o;2j6l$>H< zq*}B0=J3Uhk-l8Rs6dL(3Y)n}i{)aOv>x*NyW^x~4&$EJPXE#56cc$ejsrYoI{T9!4Y`ypV zgl?JpN(uzYGlhR|=rY?AXJ1W2KdOdcvajh8pRe*<+m%Fm=bHFk9;)`%@69n}%oFkz z(F=qLC}~q&_eeDN5eWJeMkg^}6uj)!vExJ~;`PQ0w_egVCtH$pH(!|#5_zjYB326N zQvgpC_nr;qWKl)3q#-@@eD)?UinuR7N)&c57@7HsHlFOOXz%M>#$7aT!KkR$*s1h* zR&DE%%nU4;;kI7q@_9{vd*|&qfnt08S((hq6v}t6I7!q^zV$(jW}Z@7snj8Kpr~2S zVkRQyYpF#5oaX}eS%LSUc7K6I)I>|1v1GFtBk?(=@au1Nnu0=*8a2?Z7Xe|&$PqEm z#_*3v7a#aaESZZtU*s}m!{ge0CrU@48uQIwMT$645)-qrl3Z+y+Z=&$^j5s2 zdFn##>s&1lZG+RMwI1E^<=EL=3W}-b)GcmC?-=Y2kdOF&`)1PC@155!v6EcXBEPU< zxWjxWMOyvcO*^?#l%QF!0h>YUo1sdW#>T=R$6KA8@U1IWl~F z(Sw$f(KC*!e4&@cndbWPqJl2^#zA1KikTUTNQ{L! zaa^&C0i-R7xF8FBwYPeiX(Ns9yr{e8Vh!G>2_c59X+wFXD<_M{Ibxa@D*K9aBoveM zdNh})la?WO-i4#KO{xoPX6ByYoF>1#I_kJE;G$b@9x>~ZdEO0Jse@&9j~ES~O{!+D zx=LG;CI)Tp`;>fVMey#}?UsJei&&HR&!__tfAz|LM8 z&!qhjIw4sjo1qChk}!@5sO*F0i9q~=9oWhTf@9tPYXnO>FGj|$5Xlr#kd_=h-ViDa z+e_!EVW9KfF5~xH=?uarX&aZiKVwphFi@oAIRB~|;gNTzusE92NdD6G2b}h z+IdY&HG7mBmn7^4xv*31F#&WwciA6!>M2cHEOG10hsk{7<3^J#tiY(jUEW;Hp)r{6oY^FW&XWFPdtB3k?;^tAhKKR2@ z6DzEzZtzP=7?;v3#d5y5c2qOdQER5pH+*dthY0>lkZFETCE0aBj0xCTL@$@I)4m9pKb?{=fI)vj#F)njIv=Q)F+*E?V849 zR6U23^e~ab1sAN%M@OpE)6~m6_eB~>PS62xu=RP3ZoSbfBEE16M2r^{r@07%6NgI zy!Iku$(l<~VTybBbz+fR$y2nAIfLzhbK4WmLU>PQ7-WFPS8o;M zt>G7`r}$o0AX=`T3`=~teW%3LWvabJCpRX$zd&^EFVq%|sE6jM3*2J{4|pq+*>$_g zk)k2DCW;6Ari@D3z47pZFX@xko$0ooaxAFQg@LlV{xr`LRmXdHAJz)XcBI4h1Hn48 zmCl&ZwZ;CzL0kfk?>fE)1O}71S@DGqC8Gzc1yK0hQ=L&wMrhVmf5WU( z?Tzwj>KU<|h|YR=+=aKj3bEP!wX>y#Pg~;!V=a^}j;;vz5`{J0nqEns z=uA^GQNOS+GkSmU7Sf~qeW6c7HYpz~sRVwvu<$b~JCAqH29oVr#e;mvg_?_IO6U4TyHb>%w-mJZqgVxS$hIU!g?rY$TECWzsfF(kv$Bm zOl@Wt;tt;wT6ieb+T;F@FRb%sA=DR0E^Pe7Ba~`v;6-o?h%nPp**+`qrjq zw)MZ`knMQPn{wYT-)da8t+rFt7IW_2A_SJI9l}m-_e#)h1m5EM^n?#jkG0I!4)$ z3r-16X{Rib5La~E{ZC(_PxjuvbJs1QYCGN;Kdmu!4qnD|3Ff4$8ZRt9ubw(6&e*zm z`o6R7wV){LzD(*^7&tiw1C?Fb;X60%>|T2gFY`<1zC*OwVz{%XiyLdr>{Q_;4>K>{ zaKFhO%|l^w(J2u>g*SdWPOG20{N8=xg5}3|aa=6u{z{h&Cq(Ozg~ejAW67&Jxxg~N z*;DP=A|#0j{X&FN59XXFfH-OQUe&hQM3rSz?yHx?72gpO26^8{kzBW74(wx7@w=#D zx--ddsmJHwqN1p@b8ftI5*KLQZb-1ade|oo(a+P4<}W!K5GHq*#N4mJ>&peUXo>8- zFo}J?-D~y{PMIIPu9PP1OwP6)Dg_@Dj=pG}&`;xZqJO2;wT(GnXCKca>BjFi2^Uov z(xr9^`0{9fbj0B_Dmy5msF7b5V>6T(Q&D))jqyB&gx_nhm6;cN1JfB-cFa|%)@+r` zr^0nFp3xOA3l7GYQ(?GH0b}GVxwA@T1!^+)@%r{P9MIuV(XQ!JY5}gc=AYLxOkoxH~u*PLKo_pNNaiZeCMjR(<<9*U%1Xmrw)6VdZYbp4K|hQSTiU1jOn| z9LpV{MndK-{=uli5^9T@Z%yi5E^QYjuGwH_K|9FQXQRuym~)N?#VR2yVM$XNr6ueB z_7ywm4e7^2ciILv<|W2BWnJvwhIr}LRfcjvA}n(mNZNO0S`sTPQ5IJi#Ue^Z#3Z8P zi)Mw59T%ZU74zz^L!wTU+;G-BA$wQ3wE#)A8<9|MW4}?<_VGH$%|%1?D#d4iJ*$O; zFE%Vxyf&<(fcbw*KGmMI*!e=ieP7}G=Ig#STfDmK&;rfW$&fwPws^$E%{H3w_^J1` zX43Ann^AQmb%|tu@m6=)gos9=p(9BjiE4_krjuFmSPh4OtxANp!qF5y{BcRG%nhqo z)I>{KE9O266skw;oQqn9>xvYHvac3K8`*d0-Ef(qWPvO)e{4*q(t6tyeoM+NaHpDV`1%#h z>Z3B{Z$@J;yowF?5ij^0*GlhRMEbt=F6O-dtl6|rhdEbWjo5i(VXQ{ zk{(8$`)+Am=@su$G_p!@d9iPG@)VJYx=GJV`8nb(yY4@mvg5WwwAf%A^(XW(D%8W{ z{Yf&rLVgX9u114_ATO%UY&yQV=Kwn`!pr7{hsIG!A5Yihw!6-&(+UwX6thIJ_0GL} zfr}y#OlAc~pUp$cWq;!!w9kiti^rXWdb5hClj=)>RT_t5Y`!L5s7Tn^v>hx~Op4cf z{l2ftnrSueR)El`t6ia>H5Ap411BB(tz_xMX$S5EM78_y5S!0nTyG=qc$ydPRA+{p z+RWxcpNTy`HUOvo=C%p$TUCig?N)vyhnt=5dvlBE7QV&z-p+1T{ZMz)OHZe_ALzf| zwJ+vL=PY$QSMG*A^eI!%3M_p@13%~pF!#Fu*d_WwRj{A`A zU?ac#;s7!(p>i5h{P@ffZoqhPN?*BGO(tkFfblw%Kq`ivta6%iWiw>?RF>9<+L!hz z4%m5Sf}|C-o4=aTh7GwS+OEW#zyS=Cn%}~fHp-szVi>K+P#Ltwb&nDzta6Fh*g1$2 z6?Za9?CJ$}O~>8_xT{Tnc?+A+oC1m>h~y$SJ4TlgL-GlNZ!qB7$*47(utAhniCPOz zkvM`xQI(qH0y_f?i*ZR`U3!lYE$_7-zzlu1TfEy}ydc+K>G0Y~-##Lx-n{#{N!!s* zRNM>1ByU2Q=l!`}F7=`ZE>pK0pbnY3jA*+>Lrai(N2e)WRGR6uNIYHwt)NB+TAi-V z+i@5jWPxzoGhW%u@@DZZ=7hJvF>Qsfo}RoBcI|5=EXpa)&>Zc+!yms3PxiiMLoMj> z5$5q8b}kQbM__RHR2Y?|lYY6UBbhk$qMQT!xqDv-ChV>oS6{79|*WGeA^ zQiBAf?;9**7)`gjX-^c!5#*nsTWL?*e~;G6q!humtEN=Ss)spdF;Xd_o+^K5s?1on z88wXTFpR}8N-PpE;^NoQ{3%S(sDUgywYqri(jf%Tig=YonB!m(?vY^E)M7v+%mI6d z56gVtuIFqGS)nohqxxIdq<5Qc7a{Td4u#?TO0n4{CGdD)4)+AH&n&9nu&TymhK48X zWZxNi7Fqc{LoGV_p}2|`p>2P)BFrYNw%tbYw+AXajP$Davrx%G4ViY;4>MX5$02PJ zyY^I8bPu6EgBcA|#`4HY+~pMqAuQS&YB$7M8_!c>QYR-`@~R>MHf`|QzukXW(0<=; z@fyDwdY?OvoB~U&4c$X68j9BSW_((k95+hmCw(X&L19`9|4i?ARiGAY|Gqu;nJkY$ zY`f<=aZ8{mBjxbdnq5VwneMU##vUmDZt%Mj+b+KOl@qzka7)P?gEGkJr!fC$T@J^L z7RE)>@##fBzPL=inhtKsv#9vIbeJdLp-Y7@NKczyWytn@%BjsqHkQh=(J0%TskWqw@spug19)Ot;>l-a?VlW| zq2l+jQ#|y(M%D8WX5rPiCpalanc5a0dK99C z^9#Rj7}+h}pk*xJ-J8Y?Lwg}rqObyUz_(`pWzP|o$%Famk3mRXXpTEuVLfNJZ5#Sn zf_sl#@TrGTornvzms@(m@UQPe_q^pI0f&Bxy>Ut8e#jhhIhw{9Iq zuY3r~`ceI=0V{z7OFP#_33|S|Z;amGB5h`zvG#Od|B&f1{yEQaaR}0WMm3hRhDpun z3)biHySnqaQc|3y(1<8{Fcz>9DQGp2kZ?hng*AJ?jSz(jAMo( zY>}a?>~c(xmfhw3;;4{Jc$j8Z_wWR|=V-=ko`ike1uTcB-NQDo1twp#Dsq#=kH*!0 zPxL;2fDUk8a4ipzIf`_nN7DAroV8;VT(;#)842iFm zbWia=fevgwh7N4>8}}cV#kx2NHH2VXG8vzM=O3w2`D+#@QaFWW^T(%RR7lypPj?yTVNW-UaMH^8?EjhfOU z{4e4&U=d#(pDfcuii2Uc*06uBNwwZoo2cGdblSHad4C6)qca!kM^5V}=R`!f+uwXq zH3c%5ieF)4K1|_>AMxbZ{M#azE@j2v>2MJ;%{h}$()5hvVyaKlrOuZojJWr5JZw4} zY$BIDm?Z1HPlh!Yqy?p^yzNW7pFhTD`#P=UH5c$}_xS<|e(nEW@|L8# zq-3*FKoHsaK=f2l4TEv4%47nm_kQN zeVSuTR@;q)t_(GWI?K7{rYP3^6?qIOcVoB=*me2RqCjPK5LPwG(RX9DD@z7Tl!qTV znUtzES6txS#K3l^Ao{PvZ?$m<(c;GkapB73(*!CI7=-V9ll~Y>-t2PBRLdPT`L@1A zTcL!Tt~t7iV(IG`>nX~}$4>*A-jLT>G=4i=J~I4DyIxVte0up#=yK^G;8rIvA=Gzz zr_OV$YqF>yxJe<)j|%-8P>0rcHmog6&d(Ic>~II3vkX^PQ`>7;SQ{rXs4P|U8CrWW zl`a;a7HHny(R>g!(NB*~ep=y0Cg{EYB(D(5S#l7pUEa>M6j@8aeht=}g|EH`YqGbs zX7Q%S#z0+t)*`-6M08agU*#f94-NrtLc23l5IjJ<=uFoc(aNVng z{+74`=FYJqor$78{icAVispoc(Qv@VE7meKrP#`jr6N+jVl42ffz`vCCB|+|<&*1> z5+2Xo*ho=dx%QpowP$x+*CW0>eJUojp1I1;B-6ZmfCyq+d3bd464$ylLlfSV3frad z1-@-)UFV2{(5Pu{AeQ~?RY4tQqH0rABq&yg)0oBH)m^GNmW$P**}svM&aEQD%<|LB z*QP>sP#o*u9;cita$6GR)Tl}39IkLZ<(ZeE6c@2VQ4>Zli|OoZ(qK(%3Tkio%EE0W zBU9JyrO9H@`QitlxYh3P`jvE2<1tfj{|4J|a*{&iRC5f6BYtnQB{xYlQAvrQ%^+wr zWKLn?K+Wl)n%u*t0xie6USsg|>#$c26a+;En_*UIqL`;_^*%;)W@Ve%zJ zvY=+7Fi{FKsK%nRPWSNXoQOCo{wZNMBgC^7AZLgH3~@vy4BG@4+*CkVTcD;RI&*ed zS64akhK)Ad9~VGzuPkP7w&yJXL(7Cm1(6W23g46E`$TtGZyc#cfRcr!&-M%}42`q2 z0EG|}P_H=M4!^GRpf8(!u*7yxN48_=FckT6ek8|Yy{{oW0IwOv5EqMo{;;v=aO1IZdH01s7u^7BQ;6fP;=EgF0K{uEL)R_#5k(M8Wbef) z@wlb!^)qks(N7ad?NsgopV$yf0hL8i6(i|Qo3bV2s`xH1?MS4T&Rjmw@%WQXn z@2C+V(Nj3}gpK>C>3RrQPv!FWD+%cF;6h{Ku-vA{cSz8;+yxY54$vSO;od*ay!dpt zjN@e6>jzd9f?NPEe}GM&Be=*XA-}rFPg%>TL@_m>%Sn4+RmPV#0m4C6xz8Iv0wlcr zoA1tNhm^CNfO3IFbTC~6Pqq=cMR>C8)jsm&q~-2R9U#+*jT5lyQoKJ+PIbdP{IZ0r z=D)rIcz4)h+Yl~@*)n&i?dcw>Mmq4E2A5}}{f~`)(%?2ZsMyBP_M$pUs3NjYP2p8c^Fjh zW^}*RV3cgp$nd%AGgLi@Gt6mC5S;axe0p$Q;FUkFLsZ-g#70|S$6uj^usd4TLN+)Z zUnQl0X8rHGa^kmL30ZdjUMk_Dg1oB(4d&z7@EtmpLLL$NdIPs)#QY_aSPD!rGf%zdF)OlCBe2CUi@m?Te9v1 zi2_0BgarB>ZsY1~>#8v8D*%wNAb)*-5U|@l>6{~n%CN#*A$0h|pwcUyYgoY&aF!;T zWU5_e`qoZy&e7Qo=YQHg!qupLER$TDK~`)mhlXOCTqJ!@Xuc*f;dFLL{ra9DBG(G> zI*fgCT%Xl4e0%ie!QxH-Ts#J4%qil8i4?1FYf2O;w3v-na9kOaG34>Od$57|e{P^f zOKg;mvHg|fB$TleO;MsbcwFuA{&yxx%6mR9IE{;?|BKD2ZDG)cG6}?a1pO0?2#uCHnP#^zyV^kKJN;h_ z1U9$emWH$DVg~9Q$MMf+`t!XLl;eesfFO^h#BR8A{j*#V@Mm%qas-bzd5mx}s9qV! zeGsbsS*Nk2v;@^Si>)so9akra|J$wrLy0?ahFS!F3bOA9$J_gGI?r_0^Eo%(6nW=c zlPf2ld0=K&|1`7Z))1f$)qHCtWn|qkfLQ0%4@@~eIp5D;ZiM^s-Jbtubc*gn6@~0t zxuCu=8ONj$DI655mMqS!#St@=!R&0do!7U$KDAI_>SNKqRCiK{Zm9Un!;}w!PXHT` zNOAlO^Q<%r@K03Yj=`F5wnlk6l;XIXdUNy%WnVt~Hqtf*%+0~?(MVUk6an_ekK(xM z`JbDEl^r~L4*z%y9CyD*9wVyCaPZCk0fm#(8af@#IIz6V-z<+FazhpQ{gep&dP)w} zz8;?_JGe;l>2I$s>rP;Q+7d+=mEt%%i-xAYf4)0^e7-`v@i51+EeBZjEiuCuZ=(ZK zCjTvh0bjr<7Z#OLuh>X|b81=`EOE)Hkt+gvUyiBvWQ{7la_5P!!u=2+e}NB-r+!xe+-sRUt~TRyxqsrU-YX!?TQ8 zKK$m{XUOR03zFveeeX7;4CG=vTloQ=srKvw+^ z6aX7(=R^o^%@P_P5v{s4b~(8h-R^K0SMT!Kqt%-t*^;oHhEV-##~en996bS2PZ>s2 zPg1|;()`zH%Kc zdFOlx3EQ9`*F->nA(KNvK#F(6Cj~wQ`TA$gy~nhRMtujl=5($v4^7*M7)2StM%OBh z>F3}1w)Z)%E#Gce;nLdhR6sH$AEX%3<7cx_w>Ny(%4u>EuUkgW^QiD&9pl-uk%1YygeIc?obtV%$TUOUo|qf?{~>#uMN z!@4obVy*;+T{Dcw1Blv%-L5* z(I)$FW~e1Q_HGQ7I%s5Rva>QLb23w~sznjh+(0|S0HKvVaQP13@ujjzEl7K4Mo+2j zSyDIZc<(fU+;HMm0IehCIl8YkYCs%54mtl$GZ1dCTQg|V8qZaMf{Vz3jD50lv=J>e z`Fhci$$rF(&$okbrgO%dir*s@-lEr)-tNkshp+{Lb@E=E^ya?TL+r<#CT6-J6d*}| zB=vwL{RVRCuAx5t_pyWuC=j(ie%G5&QIw^VNe{Bq?)7Qz2MAU!v?cJ z^?rwGBqz+#l6R%{8Ftc0!ufUp=EoIJ4o*A;!Q1}KD_|c+U-Zn?8wm0x=xUfPhVw}< zZExr=)bGY>)7uifW)sIBUUNp`;q&e{y80*1?5chaqhVxKy&MNHQR5f#*UV<0mD{k6 zN30H@fYI+OBx)zfGWrw4JJn?G13~MI#dz$(s@GEw{H&VF^uw9&0fp<=fbz)R&l0G> z+uCn*XKHatwzM9>T%Qw?+lo*#>@zJn2sGz@kFT=ss3navbl0_IPg64h)E{o_gVTL+ zo{dG!b2GxaFIR;0*y+?W1YZdIGpJw!ARJn`Sr3YExPVamVvU}V9L0mJp#5Vj*fdzA zS0{O1K3E^P{&sPOG%#zV+l=|(Q~n0>pKGCcOOg`kh}Tyi-qOH-4xug|sW&}<^q)w7 z4IBr*nvh_*q?~w7RUG$bjz$IpgbNc1_9q*^-8yQ1z{dRhwSjaJ)$k(G$>hxG#787 zz8ta~d|6CYT`XGf#KsaU38uZLXr$pg=1}_sb97Zp$ys$3S1~EWZ|546F$7U^hx61- zvjOw&TmNMF{W66=E*lpt@d$}u9hl3R2z>I4KyOBAWT-Zm^1im%diU}0il0RZ9btb& zj{SZbh{FbLun?q>Xf-33eiiz8J3ufNlg*Q>b`3%V#`Rwf1f2Ub0o+(54Y(1G1xRYQiGNS$n%j;O1L z*!J6GYDjQW3))BBI$9GYUgbIK@t4x~mlylv<@ud9AWc9W&Z%F1*TZKYK|nILq`}MC zMn&qN;pbLg-QDlm*)$=c`a8o*j#M=ik9_?qfS{rx*Q4bzf*^RUa|Jxh@^?4p@*+jB zuR$KObdbxCnq?jsOiI8XcoKEG{Ta#BWRZ?>=od#P7{}U{+NuW@T5uoj^{+Xksi8Ze z#i-~(U(6JB)zvs2<5)Uq`)O+!;C|C2pD9N2>)5ejofSlU=HKM%h`%|&{eS%iX!5xs z7R`Q*eWPBiAgK`^pfm=)8QPk-xN}`Jf;#M<0O4~Nv_nF_?>92u_K`p@1*N_-`0t*a z{ddbC3IhtmeZvt+nW^0qN1mz1Q0MByQBBG;2^br3oO&D|c{IDbcm`^^wdx6%F;%MQ4K|}`qY7l^^dZ=G+7rv`K*Oy$<@&Xql zCKN>Aylr2hr5{rq*OyfmVLf$8u{%&1tSw-$^C*8fky^LIVAVRmNa>V*`_bl;Li~{b zBwK`vM%MCl{9o`QVU0;;ttf+EU+{xltp@0vVbjhoC3MFW+l+u@fiu$B7bo+tgqAUJ z`@k7}CJ-pe^?Y_VY+*Y&8+^92=Yaq>CARGPK7m^kYb8w_@x||fSB{WY6OsWy z3KE|GBX+9=#oA8PwHc<3mKe8eYOu5*fLf?tF(yr^B#ap}WJF$f@-Pg8bhH1hAhUaa z=0`=Qe(O{q1#4`M=tgt9gmE}PUW^dhy9rqYbYmNIn)OuT)vtV}%_4Wc+)hz7Cjdzh zbX!`fg;EXrGZ^0IKa5D>1MO{A%QiIqr6zk~G#~$#+Wf4`OznmF(*|yM6S!sqddpBv zl6Egu;*gZR`~LEJxbC$oxIx+cg2^j_pTdRzB#jXQ7UfKeiFaqavoF000fFo)APdn5Z7L!mWi}(_O5$F48n!#D3YM`ARjDqcd!*8X+)n9w znY{y^1JIhvuX#1|;aVhbJ?&K6D(&S*o-BD1@cY-o1t*dBc{Nk%u{nHd>ggUs2NjVN z-L%CA{sH4GW7Cd9(kh+?Vs>_T7k;v{-lN65;81mii6*X#6fX=ES+8m~rL+woJd3ol zHD&zI(oGVDRkX$zekjY{u&L4`AAw>>v6D-KB?o*rR&Fp=Il|$v4V(gUEg) z7fSIzk_&JqKVcqz3c9Ekngp3c4G=PxuIS;Nvn@YUmUw6{rI;@JnB)VE`%E*cZlNn5 zTThm-jCws}1hu~(R0=rVTZ-<00O!ilD~bt5Fo*{=I8XLKd7A2jF1l2y_v#hc#0-_M z$93lzsuR_ZlMLC5+V;;krSV_KtHa@4OhsI zRN~C{Q!F~ux_0=WYmG#Cy`Tco7EIcXMmI>+oqSrMl0xe|lm>DyH!GP|qK4Kg5xZz( zm_v0uK+HpaY>~{?+Hy=Ni_~P*hT6sS^1jzlQL^-kS( zB)6eQf2l=9cbdjXM6|P#Kc~s7Iap=`tgxZ6Hi1gyuhy=)PR-fIiNPbIhh4n8|1+XsJ zGM~NjTvqY72Y5jKH#|^%4p}|A7I$NPRARQ}EvSSj0}kdE%H9Z3Bnoq~=vr@N{T^Cn{@777q(|b7^*Z(C6$rWB z2&jZlofPHJy6V|5n%n8J>8o?_%!5Qs{}-yq=^|%@1h--26m@sdm(|N6PR)@PZ`1T9 zEzR4JA8=`R!Grz)03ZjO>gm&K+@W)h^>6Pvv%}jCnB$f=ycA4s$jUa`naA%BHZkwl zO(byMpPIUu+!pahwR|;6>$hjS+n!iBS;peTatO4i1@vP9OuW5npNoqorQ-X}PW+}Z z0$?Y3WBLLMq!_bLT@!2P+3u?zNRgu`noqbsS=;H{xcFHWV`6G3y!$eWc57N5F#!iQpR0}9XnXD z5!X~n(LaMCLWK~ve6Km0Elo3!fm{#CYsR8mVG`7xtE*LPKbSQaL;Bsw{eS&F;9(i# zqDu-D8}?1#9`9Mq!|xDi@}~W}X94q>0(eGk(3O|^uV=&_^lLnP*xZd!uas8En1tpR z;06IHnr532%jY|C`M+7dofFALHulM82}UY@^T?{5jmC+<@uRcEEp`$F5Asj6C*gdV zHH0dT=Iu=DEn>fK{nbCVUKh0VC5n3XmQi#3B}g#liNAi$B|%!~JhvZM+5H|7&8=n7 zmWWg6^Pu~lTtfbU;_dtw*qhvro)A^j837EK0U&TBNe7CosBT-s{%xiEM+4;L%PdW8 zTz*tb|Gg3*3v%8wi3jhZ@H^Eaiq6!_@juU{ryR+w#;xx=#6Xx%@L$m-Fa+GIFNB6k zH7&t}oo~0WPhWv44@Q8~PWf-2FμI@nKN+DZzh6O~m>6y`2-nu>VEC>sP$YBr*4 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 Mp00i_>zopr0G?{xv;Y7A literal 0 HcmV?d00001 diff --git a/content/posts/2024-11 dnd-dice-calc-2/plot-2d6-drop-high-1.png b/content/posts/2024-11 dnd-dice-calc-2/plot-2d6-drop-high-1.png new file mode 100644 index 0000000000000000000000000000000000000000..24f49d51f6a1cc2242fb1cf20faa99691cd3a179 GIT binary patch literal 24530 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
    jX#XZ*<`}E|57U!4-7}bT- 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%0Dje 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 literal 0 HcmV?d00001 diff --git a/content/posts/2024-11 dnd-dice-calc-2/plot-4d6-drop-high-1.png b/content/posts/2024-11 dnd-dice-calc-2/plot-4d6-drop-high-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a5b643e89bc1acd374bc767e2d7724066454e4 GIT binary patch literal 24639 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ϗ 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 literal 0 HcmV?d00001 diff --git a/hugo.toml b/hugo.toml index 558f896..924bfcf 100644 --- a/hugo.toml +++ b/hugo.toml @@ -7,6 +7,15 @@ theme = 'hermit-v2' # https://github.com/1bl4z3r/hermit-V2/blob/main/hugo.toml.example # https://1bl4z3r.github.io/hermit-V2/en/posts/explaining-configs/ +[markup] + [markup.goldmark] + [markup.goldmark.extensions] + [markup.goldmark.extensions.passthrough] + enable = true + [markup.goldmark.extensions.passthrough.delimiters] + block = [['\[', '\]'], ['$$', '$$']] + inline = [['\(', '\)'], ['$', '$']] + [params] dateform = "Jan 2, 2006" dateformShort = "Jan 2" @@ -16,6 +25,7 @@ theme = 'hermit-v2' homeSubtitle = "Becker Awqatty's public brainscape" gitUrl = "https://github.com/CrepeGoat/blog/tree/main" enableGitInfo = true + math = true readTime = true shareSocial = true