Probability charts for GMs [NEW: Revised difficulty chart]

Discuss rule quandaries, supplements, or anything else OVA related here.

Moderators: Clay, Jade

Post Reply
Rawle Nyanzi
Worthy Tortoise
Posts: 35
Joined: Sun Jun 16, 2013 4:35 pm

Probability charts for GMs [NEW: Revised difficulty chart]

Post by Rawle Nyanzi »

EDIT: I have replaced the original opposed roll chart with an easier-to-read version.
EDIT 2: I have replaced the original difficulty chart with a revised version made from my more recent dice-rolling code.

I've GM'd a number of OVA sessions with my gaming group, and they have been fun for the most part. However, as I decided the difficulties of tasks and how many dice someone had, I actually thought of how likely the players were to succeed.

To get this information, I got on my computer and wrote a short program to simulate thousands of dice rolls. Through the Law of Large Numbers, I revealed the likelihood of certain dice rolls beating certain numbers, as well as the likelihood of winning opposed rolls.


Here is a chart of how likely a player is to match or exceed a given difficulty number. Per the "Difficulty Numbers" rules on p. 95, matching or exceeding a difficulty number is enough to get a successful result.

Image


Here is a chart of how likely a player is to win an opposed roll. Unlike the difficulty numbers, I only counted it as a success when the attacking roll exceeded the defending roll since different GMs have different ways of dealing with ties (I just have the players re-roll any ties.)

Image


The difficulty chart proved very useful to me as a GM; because of that, I made the opposed roll chart just today. Being able to see the chances of success made me choose numbers most appropriate to the situation. I hope these charts help other OVA GMs in their campaigns.
Last edited by Rawle Nyanzi on Sat May 30, 2015 8:09 pm, edited 6 times in total.
Sabersonic
Exalted Amphibian
Posts: 730
Joined: Thu Jun 20, 2013 10:57 pm
Location: Somewhere deep in the Continental Mainland
Contact:

Re: Probability charts for difficulty numbers and opposed ro

Post by Sabersonic »

Well it certainly helps visualize the difficulty enough for a prospective GM to help visualize a similar real-life situation that could be compared to the task at hand. Not to mention useful for when players and their PCs need a bigger challenge when they become powerful enough via experience.
Image
Get your Portable ID!

Though he may have his flaws and faults, he was a husband and a father without equal. May the Angels welcome and accept him with open arms.

Rest in Peace, Dad
Dregntael
Shelled Plebeian
Posts: 7
Joined: Mon Jun 17, 2013 5:16 am

Re: Probability charts for difficulty numbers and opposed ro

Post by Dregntael »

Nice charts! I once made a similar table some time ago, but it wasn't as big because I was calculating the probabilities exactly instead of by simulation, and it didn't have the nice coloring.

What surprises me a bit about the second chart is how low the probability of success is. You really need 1 or two dice more than the opposition before your attempts become somewhat reliable. I guess this is because ties are ruled in favor of the defender. Maybe it would be a good idea as a game master to rule any failure by 2 or less always "succeeds with complications" (page 95 in the book), else players without high ability scores might get bored by the large number of failures.

One more table I'd like to see is one of the average damage dealt by an attack, given the attack roll and defense roll (and assuming a DX of 1). If I could see your code somewhere, I might even try it myself :)
Rawle Nyanzi
Worthy Tortoise
Posts: 35
Joined: Sun Jun 16, 2013 4:35 pm

Re: Probability charts for difficulty numbers and opposed ro

Post by Rawle Nyanzi »

Dregntael wrote:Nice charts! I once made a similar table some time ago, but it wasn't as big because I was calculating the probabilities exactly instead of by simulation, and it didn't have the nice coloring.
Glad you like the charts. I enjoyed building them.
Dregntael wrote:What surprises me a bit about the second chart is how low the probability of success is. You really need 1 or two dice more than the opposition before your attempts become somewhat reliable. I guess this is because ties are ruled in favor of the defender. Maybe it would be a good idea as a game master to rule any failure by 2 or less always "succeeds with complications" (page 95 in the book), else players without high ability scores might get bored by the large number of failures.
As the GM of my games, I ruled that all ties have to be re-rolled. Also, my gaming group doesn't mind near-misses at all.
Dregntael wrote:One more table I'd like to see is one of the average damage dealt by an attack, given the attack roll and defense roll (and assuming a DX of 1). If I could see your code somewhere, I might even try it myself :)
Great idea! I'll do that myself, then make a new chart with the results. Once that is done, I'll share the code I used to find the opposed roll probabilities. I won't share the code for the difficulty numbers since I feel it was too complex; however, I rewrote the difficulty number code far more simply in my opposed roll simulator, and it gives largely the same results as the difficulty table, give or take one percent. (EDIT: I have revised the difficulty chart using the more recent code and posted the new version to the topmost post. For example, this new version says that the chances of rolling a 6 with 2d6 are roughly 39%, not 40%.)
Last edited by Rawle Nyanzi on Sat May 30, 2015 8:13 pm, edited 1 time in total.
Rawle Nyanzi
Worthy Tortoise
Posts: 35
Joined: Sun Jun 16, 2013 4:35 pm

Re: Probability charts: difficulty #s and opposed rolls[UPDA

Post by Rawle Nyanzi »

And finally, here are two charts for the average damage dealt by opposed rolls, assuming a DX of 1. This first one rounds the averages to the nearest hundredth, while the second one rounds them to the nearest whole number.

Image

Image

As promised, here is the source code for the program I used to make all the charts except the difficulty chart. It is written in Python.

Code: Select all

## -*- coding: utf-8 -*-

## This program simulates the rolling of dice and
## determines the highest matched set.

import random

## A dice cup is a group of dice to be
## rolled and evaluated.
class DiceCup:

    ## Specify the number of sides per die
    ## and the number of dice. Default is
    ## two six-sided dice.
    def __init__ (self):

        pass

    ## Make a roll of a certain number and type
    ## of dice.
    def rollDice (self, amount=2, sides=6):

        ## This list will contain the
        ## counts for each roll.
        ## Default is six sides.
        rollTotals = []

        ## Put the appropriate number of
        ## sides to be counted.
        for i in range(0, sides):
            rollTotals.append(0)

        ## Roll the specified number of dice.
        ## Count how many of each roll there
        ## is.
        for i in range(0, amount):

            ## Roll a die.
            roll = random.randint(0,sides-1)

            ## Tally the result.
            rollTotals[roll] += 1

        ## Make a new list for the values
        ## of the matched sets.
        matchedSets = []

        ## Multiply the tallies by the
        ## value of their rolls.
        for i in range(0, sides):
            matchedSets.append(rollTotals[i] * (i+1))

        ## Put the tallies of the matched set
        ## in a string.
        indicator = str(rollTotals)
        matchedIndicator = str(matchedSets)

        ## Grab the matched sets' highest
        ## value.
        val = max(matchedSets)

        ## Print the result.
        # result = "%s: %d" % (indicator, val)
        result = ["%s: %d" % (matchedIndicator, val), val]
        return result

dc = DiceCup()

## Roll results are output based
## on the value of the matched
## sets rather than the roll totals.
## The order is as follows:
## [Ones, Twos, Threes, Fours, Fives, Sixes]

## To run one of the code blocks below,
## remove the triple quotes. I recommend
## releasing only one block at a time.

## This code simulates a number of rolls against
## an arbitrary difficulty number and outputs
## the percentage of success. Optionally, it
## prints the winning rolls.
"""
rollWins = 0
totalRollNum = 50000
rollDiceAmt = 2
difficulty = 6
for i in range(0, totalRollNum):
    whatRoll = dc.rollDice(rollDiceAmt, 6)
    if whatRoll[1] >= difficulty:
        # print("{0} beats difficulty {1}".format(whatRoll[0], difficulty))
        rollWins += 1

percentage = 100 * (1.0 * rollWins / totalRollNum)
print("{0} dice against difficulty number {1}:".format(rollDiceAmt, difficulty))
print("Win probability: {0}".format(percentage))
"""

## This code simulates a number of rolls against
## an arbitrary difficulty number and outputs
## the percentage of success. It also tests
## the rolls against a sequence of difficulty
## numbers.
"""
for i in range(6, 26, 2):
    rollWins = 0
    totalRollNum = 50000
    rollDiceAmt = 10
    difficulty = i
    for i in range(0, totalRollNum):
        whatRoll = dc.rollDice(rollDiceAmt, 6)
        if whatRoll[1] >= difficulty:
            rollWins += 1

    percentage = 100 * (1.0 * rollWins / totalRollNum)
    print("{0} dice against difficulty number {1}:".format(rollDiceAmt, difficulty))
    print("Win probability: {0}\n".format(percentage))
"""

## This code simulates an arbitrary number
## of opposed rolls and outputs the percentage
## of success if it exceeds the defending roll.
## It also optionally prints winning rolls;
## this is useful if you want to check out
## unusual results such as rolls of two dice
## beating rolls of seventeen dice.
"""
rollWins = 0
totalRollNum = 50000
rollOneAmt = 2
rollTwoAmt = 17
for i in range(0, totalRollNum):
    rollOne = dc.rollDice(rollOneAmt, 6)
    rollTwo = dc.rollDice(rollTwoAmt, 6)
    if rollOne[1] > rollTwo[1]:
        # print("{0} to {1}".format(rollOne[0], rollTwo[0]))
        rollWins += 1

percentage = 100 * (1.0 * rollWins / totalRollNum)
print("{0} dice against {1} dice:".format(rollOneAmt, rollTwoAmt))
print("Win probability: {0}".format(percentage))
"""


## This code simulates an arbitrary number
## of opposed rolls and outputs the percentage
## of success. Unlike the above, it tests
## numbers of defending dice in sequence.
"""
for i in range(2, 25):
    rollWins = 0
    totalRollNum = 50000
    rollOneAmt = 2
    rollTwoAmt = i
    for j in range(0, totalRollNum):
        rollOne = dc.rollDice(rollOneAmt, 6)
        rollTwo = dc.rollDice(rollTwoAmt, 6)
        if rollOne[1] > rollTwo[1]:
            rollWins += 1

    percentage = 100 * (1.0 * rollWins / totalRollNum)
    print("{0} dice against {1} dice:".format(rollOneAmt, rollTwoAmt))
    print("Win probability: {0}\n".format(percentage))
"""

## This code simulates an arbitrary number
## of opposed rolls and averages the damage
## from the attacker's point of view using a DX of 1;
## this means that defense rolls that match or exceed
## the attacking roll will return values of zero.
## The averages will be decimals.
## It also optionally prints winning rolls.
"""
damageSum = 0
damageMultiplier = 1
totalRollNum = 50000
rollOneAmt = 2
rollTwoAmt = 2
for i in range(0, totalRollNum):
    rollOne = dc.rollDice(rollOneAmt, 6)
    rollTwo = dc.rollDice(rollTwoAmt, 6)
    rollDiff = rollOne[1] - rollTwo[1]
    if rollDiff < 0:
        rollDiff = 0
    # if rollOne[1] > rollTwo[1]:
        # print("{0} to {1}".format(rollOne[0], rollTwo[0]))
    damageSum += rollDiff * damageMultiplier

avgDamage = 1.0 * damageSum / totalRollNum
print("{0} dice against {1} dice:".format(rollOneAmt, rollTwoAmt))
print("Average damage (DX {0}): {1}".format(damageMultiplier, avgDamage))
"""


## This code simulates an arbitrary number
## of opposed rolls and averages the damage
## from the attacker's point of view using a DX of 1;
## this means that defense rolls that match or exceed
## the attacking roll will return values of zero.
## The averages will be decimals.
## It tests numbers of defending dice in sequence.
"""
for i in range(2, 25):
    damageSum = 0
    damageMultiplier = 1
    totalRollNum = 50000
    rollOneAmt = 24
    rollTwoAmt = i
    for i in range(0, totalRollNum):
        rollOne = dc.rollDice(rollOneAmt, 6)
        rollTwo = dc.rollDice(rollTwoAmt, 6)
        rollDiff = rollOne[1] - rollTwo[1]
        if rollDiff < 0:
            rollDiff = 0
        # if rollOne[1] > rollTwo[1]:
            # print("{0} to {1}".format(rollOne[0], rollTwo[0]))
        damageSum += rollDiff * damageMultiplier

    avgDamage = 1.0 * damageSum / totalRollNum
    print("{0} dice against {1} dice:".format(rollOneAmt, rollTwoAmt))
    print("Average damage (DX {0}): {1}\n".format(damageMultiplier, avgDamage))
"""
Clay
Dangerously Sane
Posts: 1282
Joined: Sun Jun 27, 2004 4:32 pm
Location: Nowhere-land
Contact:

Re: Probability charts for GMs [NEW: Avg. Damage Chart]

Post by Clay »

Very interesting! A fan made a similar (but not nearly so colorful) chart many years ago, and I’ve been prone to linking to it when people ask about OVA dice probabilities. I think I’ll have a new thread to link to now! :) Including the python script for generating them was also pretty cool.

Regarding opposed roll successes, keep in mind that characters with equal amounts of dice will have roughly equal chances of success. So while it might not be reliable, it would definitely be fair. After all, if one side got too much of an advantage with too few dice, that also means the bad guys would get that same stark advantage when they roll dice against you!
Rawle Nyanzi
Worthy Tortoise
Posts: 35
Joined: Sun Jun 16, 2013 4:35 pm

Re: Probability charts for GMs [NEW: Avg. Damage Chart]

Post by Rawle Nyanzi »

Clay wrote:Very interesting! A fan made a similar (but not nearly so colorful) chart many years ago, and I’ve been prone to linking to it when people ask about OVA dice probabilities. I think I’ll have a new thread to link to now! :) Including the python script for generating them was also pretty cool.
Thanks. Building these was actually quite enlightening; the difficulty chart in particular aided me as GM. Now that I have the opposed roll probabilities as well, I have an even more helpful tool. I'm also happy to share my work with the wider community so that everyone else can benefit too.
Post Reply