It is currently Sun Dec 15, 2019 7:01 pm


All times are UTC - 6 hours [ DST ]




Post new topic Reply to topic  [ 7 posts ] 
Author Message
 Post subject: Probability charts for GMs [NEW: Revised difficulty chart]
PostPosted: Wed May 27, 2015 4:52 pm 
Worthy Tortoise

Joined: Sun Jun 16, 2013 4:35 pm
Posts: 35
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.

Top
Offline Profile  
 
 Post subject: Re: Probability charts for difficulty numbers and opposed ro
PostPosted: Thu May 28, 2015 1:32 am 
Exalted Amphibian
User avatar

Joined: Thu Jun 20, 2013 10:57 pm
Posts: 713
Location: Somewhere deep in the Continental Mainland
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


Top
Offline Profile  
 
 Post subject: Re: Probability charts for difficulty numbers and opposed ro
PostPosted: Thu May 28, 2015 4:22 am 
Shelled Plebeian

Joined: Mon Jun 17, 2013 5:16 am
Posts: 7
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 :)


Top
Offline Profile  
 
 Post subject: Re: Probability charts for difficulty numbers and opposed ro
PostPosted: Thu May 28, 2015 8:14 am 
Worthy Tortoise

Joined: Sun Jun 16, 2013 4:35 pm
Posts: 35
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.

Top
Offline Profile  
 
 Post subject: Re: Probability charts: difficulty #s and opposed rolls[UPDA
PostPosted: Thu May 28, 2015 9:36 pm 
Worthy Tortoise

Joined: Sun Jun 16, 2013 4:35 pm
Posts: 35
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:
## -*- 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))
"""


Top
Offline Profile  
 
 Post subject: Re: Probability charts for GMs [NEW: Avg. Damage Chart]
PostPosted: Sat May 30, 2015 4:22 pm 
Dangerously Sane
User avatar

Joined: Sun Jun 27, 2004 4:32 pm
Posts: 1279
Location: Nowhere-land
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!


Top
Offline Profile  
 
 Post subject: Re: Probability charts for GMs [NEW: Avg. Damage Chart]
PostPosted: Sat May 30, 2015 5:18 pm 
Worthy Tortoise

Joined: Sun Jun 16, 2013 4:35 pm
Posts: 35
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.


Top
Offline Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 7 posts ]  Moderators: Clay, Jade

All times are UTC - 6 hours [ DST ]


Who is online

Users browsing this forum: No registered users and 5 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Theme created StylerBB.net