I did a bit of anydice work... adapting code from
4d6 Drop Lowest
If one is in a random PCs mode... (middle 1 of 3d4)-2 for each.
Code:
ABILITIES: 6 d [middle 1 of 3d{2,1,0,-1}]
loop P over {1..6} {
output P @ ABILITIES named "Ability [P]"
}
Generates:
| +2 | +1 | +0 | -1 |
Roll 1 | 63.92% | 34.52% | 1.56% | 0% |
Roll 2 | 23.83% | 65.23% | 10.89% | 0.05% |
Roll 3 | 5.27% | 60.36% | 33.69% | 0.69% |
Roll 4 | 0.69% | 33.69% | 60.36% | 5.27% |
Roll 5 | 0.05% | 10.89% | 65.23% | 23.83% |
Roll 6 | 0% | 1.56% | 34.52% | 63.92% |
⸻⸻ | ⸻⸻ | ⸻⸻ | ⸻⸻ | ⸻⸻ |
Number where most likely | 1 | 2 | 2 | 1 |
These are lopped off at 0.01% precision by Anydice.
This produces an expected array of [+2, +1, +1, +0, +0, -1].
Going to 5d4km1, the array doesn't match, being [+1,+1,+1,+0,+0,+0]
switching to a 1d{+2, +1, +1,+0,+0,-1} (a d6 marked +2, +1, +1, +0,+0,-1)
| +2 | +1 | +0 | -1 |
Roll 1 | 66.51% | 31.93% | _1.56% | _0.0% |
Roll 2 | 26.32% | 62.74% | 10.87% | _0.07% |
Roll 3 | _6.23% | 59.40% | 33.5% | _0.87% |
Roll 4 | _0.87% | 33.5% | 59.4% | _6.23% |
Roll 5 | _0.07% | 10.87% | 62.74% | 26.32% |
Roll 6 | _0% | _1.56% | 31.93% | 66.51% |
⸻⸻ | ⸻⸻ | ⸻⸻ | ⸻⸻ | ⸻⸻ |
Number where most likely | 1 | 2 | 2 | 1 |
Again, more dice makes it [+1,+1,+1,+0,+0,+0]
trying 1d{2, 2, 1, 1, 1, 0, 0, 0,-1,-1} (d10)
Code:
ABILITIES: 6 d{2,2,1,1,1,0,0,0,-1,-1}
loop P over {1..6} {
output P @ ABILITIES named "Ability [P]"
}
gives
| +2 | +1 | +0 | -1 |
Roll 1 | 73.79% | 24.65% | _1.56% | _0.1% |
Roll 2 | 34.46% | 54.6% | 10.78% | _0.16% |
Roll 3 | _9.89% | 55.74% | 32.68% | _1.70% |
Roll 4 | _1.7% | 32.68% | 55.74% | _9.84% |
Roll 5 | _0.16% | 10.78% | 54.60% | 34.46% |
Roll 6 | _0.01% | _1.56% | 24.65% | 73.79% |
⸻⸻ | ⸻⸻ | ⸻⸻ | ⸻⸻ | ⸻⸻ |
Number where most likely | 1 | 2 | 2 | 1 |
So, if you're missing the random, several comparable ways to do it.