Let's try modelling this mechanic with AnyDice.
To start off, let me note that the CoC 7e bonus / penalty dice mechanic is a bit awkward to model directly in AnyDice, because the choice of "best" / "worst" tens die depends on the value of the ones die: if you roll a 0 on the ones die, the best possible roll on the tens die is 10, whereas otherwise it's 00.
However, it turns out that there is a mathematically equivalent variant mechanic that is much easier to work with in AnyDice: instead of numbering the ones die from 0 to 9 and treating 0 + 00 = 100 as a special case, just number the ones die from 1 to 10 and add it directly to the lowest / highest tens die.
(Formal proof of equivalence left as an exercise. As a quick proof sketch, note that there are two cases depending on what you roll on the ones die: if you roll anything but 0/10, the result will be the same using either mechanic anyway; if you do roll a 0/10 on the ones die, you can relabel the sides of the tens dice before rolling them — basically mapping 00 to 90 and subtracting 10 from all other sides — so that the result using the variant mechanic with the relabeled dice will be the same as using the official mechanic with the unrelabeled dice. Since all sides of the dice are supposed to be equally likely and interchangeable, this relabeling will not change the probabilities of the outcomes.)
Using this simplified but equivalent version of the dice rolling mechanic, we can model a CoC 7e roll with N penalty dice in AnyDice simply with:
TENS: 10 * d{0..9}
output d10 + [highest 1 of (N+1)dTENS]
(Conversely, replacing highest
with lowest
gives a roll with N bonus dice instead.)
To find out the probability of succeeding on such a roll with a given skill or stat, just plot the results of the code above (for the appropriate value of N) in AnyDice using "At Most" mode and look up the probability corresponding to your skill/stat in the plot.
What about hard and extreme rolls, then? You could simply use the same code as for normal rolls, and just look up the probability corresponding to your skill or stat divided by 2 or 5 instead. (You did write those down on your character sheet, right?) But it would be nice to have a direct graphical comparison.
One way to do that is to multiply the result of the roll by 2 or 5 instead of dividing the target value. (Again, showing that this is mathematically equivalent is left as an exercise.) For plotting convenience, it's also a good idea to clamp the result to at most 100 so that AnyDice's graph mode won't needlessly widen the range of the graph.
(Also, since the range of possible rolls starts from 1, AnyDice's graph plotter gets a bit silly and decides to place tick marks at 1, 11, 21, 31, etc. instead of at 0, 10, 20, 30, etc. One way to fix that is to add a dummy output 0
statement at the end of the code.)
Putting all that together, here's the final version of the code (for some more or less arbitrary value of "final", anyway):
TENS: 10 * d{0..9}
output d10 + dTENS named "normal roll"
loop N over {1..5} {
output d10 + [highest 1 of (N+1)dTENS] named "normal, [N] penalty"
\ output d10 + [lowest 1 of (N+1)dTENS] named "normal, [N] bonus" \
}
output [lowest of 100 and 2 * (d10 + dTENS)] named "hard roll"
output [lowest of 100 and 5 * (d10 + dTENS)] named "extreme roll"
output 0 named "" \ dummy output to fix graph tick positions \
This code calculates the probability distributions of results for normal rolls with 0 to 5 penalty dice and for hard and extreme rolls with no penalties. (There's also a line for rolls with 1 to 5 bonus dice as well, but I've commented it out with backslashes to reduce clutter. You can uncomment it if you want.)
The output of this program is probably best viewed in Graph + At Most mode (which the link above should take you directly to), and should look something like this:
Looking at where the graphs intersect, you can see that penalty dice are really punishing for low skill / stat values. If your skill / stat is below 50, a normal roll with one penalty die is harder than a hard roll, and if it's below 20 it's even harder than an extreme roll. With two penalty dice the crossover points are at about 70 and 44 respectively, and with three penalty dice they're around 79 and 59 or so.
(If you wanted to know the exact thresholds, you could switch from Graph mode to Export mode and compare the exact numerical probability values. But for most practical purposes just eyeballing it should be good enough, as small differences in probability of a fraction of a percent won't really be noticeable in play anyway.)