Elitist Jerks
Register
Blogs
Chat
Forums
New Posts


Go Back   Elitist Jerks > Theorycrafting Think Tank > Theorycrafting Think Tank

Reply
 
LinkBack (22) Article Tools
  #1  

Proc Mechanics

Proc Mechanics
 

Contents

[top]Proc Basics


Procs are effects that have a chance of occurring under a certain triggering condition. Typically this is used to mean effects that trigger off physical attacks or spellcasts; however, the term also can be used to apply to events that are triggered by being hit, such as the effect on [Bulwark of Azzinoth] or [Band of the Eternal Defender]. For purposes of this article I will be using the terminology of on-attack procs, but the principals here apply equally to procs of other sorts.

Fundamentally, there are two important things to know about a proc: its proc chance, and it's internal cooldown.

[top]Proc Chance



Procs generally fall under one of two categories. The first catagory are fixed-percent procs. No matter what weapon is used to trigger these, the chance that they will proc is the same. For instance, a Rogue's Combat Potency ability has a 20% chance to proc on all off-hand hits, regardless of the speed of the weapon used. If you attack once a second or once every 5 seconds, you will still proc on 20% of attacks. Similarly, [Sextant of Unstable Currents] has a 20% chance to proc on any spell critical strike, regardless of what spell is used.

The second category is referred to as Proc Per Minute or "PPM" effects. These are normalized such that if you autoattack with a single weapon, the average number of procs you get in a minute does not depend on the speed of the weapon you use. So, as a simple example: Mongoose is thought to be a 1.2 PPM effect. Hence, if I autoattack with a 2.0 speed weapon, it will proc on 4% of attacks, such that over the course of a minute (during which I will make 60/2.0 = 30 attacks) it will on average proc 30 * .04 = 1.2 times. If, on the other hand, I autoattack with Mongoose on a 3.0 speed weapon, it will instead proc on 6% of attacks, such that it will still proc an average of 1.2 times per minute (60/3.0 = 20; 20 * .06 = 1.2).

It should be noted that for any proc effect implemented in the Burning Crusade era (post-60), any haste effects in play are counted against your weapon speed for purposes of autoattacking. For instance, if I have 25% haste on, I will attack 25% more times in a minute, so each proc will be correspondingly less likely to proc such that I still average the same number of procs in a minute. Note that this is *not* true of pre-TBC proc effects such as Crusader - on these older effects, the chance of a proc going off is purely a function of your base weapon speed.

Note, however, that this applies only to autoattacks. If one is additionally launching instant attacks - Sinister Strike, Mortal Strike, or whatever else - these have a chance to proc as well, and can thus increase the number of observed procs. Unlike autoattacks, haste effects do not reduce the proc rate of instant attacks; if you are using mongoose on a 3.0 speed weapon, you will have a 6% chance to proc no matter how much haste you have on.

At this point an example would probably be helpful. Consider, for instance, [Madness of the Betrayer]. This is a trinket with a 1 PPM armor penetration proc. Let us assume for the moment that I am attacking with a 2.5 speed MH and a 1.5 speed OH. Let us further assume that I have 50% haste from various sources, and that I use Sinister Strike once every 4 seconds, and have WF totem. Then my MH autoattack occurs 36 times a minute, so each MH autoattack has a 2.78% chance to proc Madness of the Betrayer. However, those 36 attacks also proc an average of 7.2 WF procs per minute, which are considered autoattacks, so also proc at this rate. Thus, in reality I will generate (36 + 7.2) * 2.78 = 1.2 procs each minute from autoattack and Windfury. Now, my OH attacks can *also* proc Madness of the Betrayer, but since I average 60 attacks per minute with that weapon, each only has a 1.67% chance to proc. Thus, my OH generates 1 proc each minute on average as well. Finally, I make 15 instant attacks with Sinister Strike, each of which procs with a 4.17% chance (as the proc rate is note reduced by the haste effect in play). Thus, I get an additional 4.17 * 15 = .625 procs each minute from instant attacks. Thus, in the average minute, Madness of the Betrayer will proc 1.2 + 1 + .625 = 2.825 times each minute.

[top]Internal Cooldowns


Some trinkets additionally have an internal cooldown - that is, after a proc occurs, there is some duration that must elapse before the trinket can proc again. For instance, when [Band of the Eternal Champion] procs, it cannot do so again for 60 seconds. No two procs can ever occur less than 60 seconds apart. This is also an important aspect in determining the utility of a proc. It should be noted that all known procs either have an internal cooldown of 0 (that is, no cooldown at all) or an internal cooldown longer than the length of the buff. This fact will be important later.

[top]Uptime



What's really important in figuring out the usefulness of a typical buff is the uptime of the buff - that is, what portion of the time that buff is in effect.

The easy case is addressing what happens when there is an internal cooldown longer than the length of the buff. If we define

D = Duration of the buff
p = Chance the the buff procs on any given attack
v = Number of attacks that can trigger the proc that occur in a given second, and
c = Internal cooldown of the trinket
U = uptime, then

U=\frac{D}{c+\frac{1}{vp}}

The harder case is what happens when the proc does not have an internal cooldown. One might expect that if one had, say, a 1 PPM effect with a 15 second duration, the uptime would be 25% (15 seconds uptime per proc, one proc per 60 seconds, 15/60 = 25%). One would, alas, be incorrect. Because there is no internal cooldown, the procs can overlap, which reduces the actual uptime observed. The correct formula (using the same variables as above) is:

U=1-(1-p)^{Dv}

[top]Known proc rates



A brief listing of procs rates of commonly-used effects:
  • Mongoose: 1.2 PPM
  • Executioner: 1.2 PPM
  • Hourglass of the Unraveler: 10%, 45 second internal cooldown
  • Dragonspine Trophy 1 PPM: 20 second internal cooldown.
  • Tsunami Talisman: 10%, 45 second internal cooldown
  • Warp-Spring Coil: 25%, 30 second internal cooldown
  • Madness of the Betrayer: 1 PPM
  • Band of the Eternal Champion: 1 PPM, 60 second internal cooldown.


Contributors: Nite_Moogle
Created by Aldriana, 02/18/08 at 5:53 PM
Last edited by Nite_Moogle, 04/03/08 at 10:04 AM
22 Comments , 7405 Views
Old 02/18/08, 5:54 PM   #2 (permalink)
Bald Bull
 
Night Elf Rogue
 
Proudmoore
If people would like to provide the proc rate for other commonly used items, I will include them. Please only add the ones that you're pretty confident the proc rate has been determined accurately; for instance, I have some idea what the proc rate on Rod of the Sun King and the Blacksmithing maces are, but it hasn't been conclusively proven so I am omitting them.
 
User is offline.
Reply With Quote
Old 02/18/08, 6:56 PM   #3 (permalink)
Thunderstorm!
 
Binkenstein's Avatar
 
Draenei Shaman
 
Dragonblight
Did you come up with the first formula independent of what I did?

Also, may want to expand out V in a separate area covering spellcasts, single & dual weapons.

1/c, 1/s, 1/a + 1/b

Originally Posted by Malan View Post
You forgot: "I'm reposting the same shit that some jackass on the normal forum posted, verbatim, complete with misspelled words, horrible paragraph/line spacing, and half assed ideas that a coked up chimp could have made better."
 
User is offline.
Reply With Quote
Old 02/18/08, 7:09 PM   #4 (permalink)
Bald Bull
 
Night Elf Rogue
 
Proudmoore
I've been using all these formulas in the Rogue Gear sheet for almost a year. I think they've been independently derived by at least a dozen different people - myself included - since we started to see procs with internal cooldowns.
 
User is offline.
Reply With Quote
Old 02/18/08, 8:22 PM   #5 (permalink)
Thunderstorm!
 
Binkenstein's Avatar
 
Draenei Shaman
 
Dragonblight
Ah, that's good. Not sure where the formula came from that popped up in the ele thread a few weeks ago, but it's probably the same source.

Was there any math behind V, or was it just an arbitrary figure that you enter in?

Originally Posted by Malan View Post
You forgot: "I'm reposting the same shit that some jackass on the normal forum posted, verbatim, complete with misspelled words, horrible paragraph/line spacing, and half assed ideas that a coked up chimp could have made better."
 
User is offline.
Reply With Quote
Old 04/09/08, 7:57 PM   #6 (permalink)
Glass Joe
 
Draenei Hunter
 
Greymane
so if i get this right, having the Hourglass of the Unraveler and the Tsunami Talisman equiped, i would have 20% chance of one of them to process every 45 sec? or are they on the same internal cooldown?
 
User is offline.
Reply With Quote
Old 04/10/08, 2:57 PM   #7 (permalink)
Bald Bull
 
Night Elf Rogue
 
Proudmoore
They should proc independently of one another; that is, each has a 10% chance to proc when the cooldown is up, but their proc chance and cooldowns are not shared or linked in any way.

Also note that it's not a 10% chance to proc every 45 seconds; it's a 10% chance to proc on any crit as long as it's not on cooldown, meaning that, depending on your crit rate, it probably procs in 10 or 15 seconds; once it does, there is then 45 seconds where it can't proc at all, at which point it's back to a 10% chance on any crit until it procs again.
 
User is offline.
Reply With Quote
Old 04/10/08, 3:40 PM   #8 (permalink)
Bald Bull
 
Thalshara's Avatar
 
Blood Elf Paladin
 
Mal'Ganis
Can you explain more about proc mechanics in relation to dual-weilding weapons? More specifically:

- What are the proc mechanics at work if you are using 2 weapons with the same proc enchant, e.g. Mongoose?
- Does 1.2 PPM then essentially become 2.4 PPM?
- Can the uptime of the procs potentially overlap (not stacking, but an overlapping duration)?

- If dual-weilding weapons with different proc enchants, are there any known interactions, or do they simply perform as an independent function?
 
User is offline.
Reply With Quote
Old 04/10/08, 4:23 PM   #9 (permalink)
Bald Bull
 
Night Elf Rogue
 
Proudmoore
The thing that makes that challenging is that not all procs work the same way - for an obvious example, Double Mongoose and Double Executioner do not act the same way. Now, it's certainly the case that such matters want to be discussed somewhere - what's not clear to me is whether or not those should fit in this article, or whether there should be separate articles drilling down into particulars of, for instance, Mongoose versus Executioner.
 
User is offline.
Reply With Quote
Old 04/13/08, 6:13 AM   #10 (permalink)
Glass Joe
 
Gnome Warlock
 
Der Rat von Dalaran (EU)
Formula wrong

I think the formula for true fixed-percent procs is wrong.

Calculating the average time to proc ist like flipping a coin and compute how long the average sequence of portraits are.

I assume that the attack is as single attack, which occurres after equal time-periods 1/v.

To have a sequence S(n) with n non-procs and one proc, the probability of occuring this sequence is:
p(S(n)) = p(1 - p)^n
The time needed for such a sequence is: t(S(n)) = \frac{n}{v}. (Hit 1 at t=0.)

So the mean of "time to next proc" is
E(proc) = c + \sum_{i=0}^{\infinity} t(S(i)) p(S(i)) =  c + \sum_{i=0}^{\infinity} \frac{i}{v}  p  (1 - p)^i = c + \frac{1 - p} {v  p}

The main difference is, that you have, if v=1 and p=1, 100% prolongation of the buff and not a gap from 1 sec after the internal cd.

The average uptime U, when c>=D, is
E(U) = \sum_{i=0}^{\infinity} \frac{D}{c+\frac{i}{v}} p (1-p)^i

The difference is, that you can not calculate the average as the quotient of the averages.

Last edited by Troffel : 04/14/08 at 4:06 PM. Reason: Using the latex-commands. Nice formating of the formulas.
 
User is offline.
Reply With Quote
Old 04/14/08, 4:19 AM   #11 (permalink)
Bald Bull
 
Night Elf Rogue
 
Proudmoore
Originally Posted by Troffel View Post
The average uptime U, when c>=D, is
E(U) = sum_{i=0}^{\infinity} D/(c+i/v) * p * (1-p)^i

The difference is, that you can not calculate the average as the quotient of the averages.
I disagree. That attempts to answer the question "if I pick an interval between two procs at random, on average what is the expected uptime of buff during that interval" - which is related to, but not identical to, the question we actually want to know the answer to, namely "If I pick a random instant of time, what is the probability that the buff is up". The relevant distinction is that when we choose an instant of time at random, we are not equally likely to wind up in any interval; we are slightly more likely to pick one of the longer ones, and slightly less likely to pick one of the shorter ones.

Thus, my logic is as follows:

Let the average interval between procs be I. Thus, by definition over the course of some long segment of time T, there will be, on average, \frac{T}{I} procs, and thus \frac{DT}{I} total uptime. Hence, if we pick a time at random during this period of time, the probability that the buff is active is the total amount of time when the buff is active divided by the length of our interval, that is, \frac{\frac{DT}{I}}{T}=\frac{D}{I}.

Besides which, even if there is a flaw in my logic (and I'm not going to say for certain that there isn't): it's a far more useful formula than the one you present; even if it is slightly off (and I don't think it is), it's certainly close enough to give good approximations in real world cases, and has the distinct advantage of not requiring the evaluation of infinite sums, which is going to make it much more useful to most members of this community in practice, as my suspicion is that most people here don't necessarily remember how to evaluate an infinite sum.
 
User is offline.
Reply With Quote
Old 04/14/08, 3:54 PM   #12 (permalink)
Glass Joe
 
Gnome Warlock
 
Der Rat von Dalaran (EU)
Originally Posted by Aldriana View Post
I disagree. That attempts to answer the question "if I pick an interval between two procs at random, on average what is the expected uptime of buff during that interval" - which is related to, but not identical to, the question we actually want to know the answer to, namely "If I pick a random instant of time, what is the probability that the buff is up". The relevant distinction is that when we choose an instant of time at random, we are not equally likely to wind up in any interval; we are slightly more likely to pick one of the longer ones, and slightly less likely to pick one of the shorter ones.

Thus, my logic is as follows:

Let the average interval between procs be I. Thus, by definition over the course of some long segment of time T, there will be, on average, \frac{T}{I} procs, and thus \frac{DT}{I} total uptime. Hence, if we pick a time at random during this period of time, the probability that the buff is active is the total amount of time when the buff is active divided by the length of our interval, that is, \frac{\frac{DT}{I}}{T}=\frac{D}{I}.
But the same problem remains. The expected value of the number of procs in a long time segment is not the quotient of the the time segment divided by the expected value of the time between procs. But i think the approximation can be used, if the proc chance is high enough. Try it for yourself, generate a large enough sequence (I_i)_{i=1..n} and calculate \frac{T}{n}\sum^n_{i=1} \frac{1}{I_i} as the expected value of the number of procs and \frac{T}{\frac{1}{n}\sum^n_i I_i}. You will find a hugh difference depending of the generation (distibution) of the sequence...

Originally Posted by Aldriana View Post
Besides which, even if there is a flaw in my logic (and I'm not going to say for certain that there isn't): it's a far more useful formula than the one you present; even if it is slightly off (and I don't think it is), it's certainly close enough to give good approximations in real world cases, and has the distinct advantage of not requiring the evaluation of infinite sums, which is going to make it much more useful to most members of this community in practice, as my suspicion is that most people here don't necessarily remember how to evaluate an infinite sum.
The question is, what we do practice or want we do theorycrafting. For practice are simple rules of thumb sufficient and often used for raiding. But my understanding is, that this is elitist jerks and the elite are not afraid of infinity sums nor Illidan either. So my target is to discuss how far the model reach and when/what approximations are useful.

The problem with theorycrafting is, that, if it is often too inexactly, it is not worth to do it for raiding, since equiment and skill makes a lot of more difference. 10% calculation error in dps means much and my experience is, that the carefully and precise calculation is worth the time. So lets discuss the approximations later and try to achive a model, which fits best. The usefulness of a formula is: How exact it covers the "reality" and not how easy it is to calculate. By the way i think that the infinite sum has closed analyical form, but i was to lazy to calculate it yesterday.
 
User is offline.
Reply With Quote
Old 04/14/08, 4:01 PM   #13 (permalink)
King Hippo
 
Dwarf Rogue
 
Icecrown
I think I've found an error in the formula for cooldown proc rates. One factor has been left out. That formula is true if at the instant the cooldown ends, you have your next attack. You are missing a factor.

Correct formula should be:

U = D / (c + 1/2v + 1/vp)

where 1/2v = your average time until your next attack

Technically, if one were to assume all attacks come exactly as clockwork (including haste rates being constant), this factor would be different, but given we are taking into account averages (and your attack times shift somewhat with Haste and variability of instant procs), 1/2v is probably more accurate for what we are looking for.

Last edited by Dontmindme : 04/14/08 at 4:05 PM. Reason: Clarification
 
User is offline.
Reply With Quote
Old 04/14/08, 5:21 PM   #14 (permalink)
Bald Bull
 
Night Elf Rogue
 
Proudmoore
Originally Posted by Troffel View Post
But the same problem remains. The expected value of the number of procs in a long time segment is not the quotient of the the time segment divided by the expected value of the time between procs. But i think the approximation can be used, if the proc chance is high enough. Try it for yourself, generate a large enough sequence (I_i)_{i=1..n} and calculate \frac{T}{n}\sum^n_{i=1} \frac{1}{I_i} as the expected value of the number of procs and \frac{T}{\frac{1}{n}\sum^n_i I_i}. You will find a hugh difference depending of the generation (distibution) of the sequence...
Wrote a little code to do it for me:

max = 10000000
segs = 0
sum = 0
spread = 999

from random import random

while sum < max:
    # Each step, add a random number between 1 and spread, inclusive.
    # Count how many segments it takes to get to max.
    sum = sum + 1 + int(spread * random())
    segs = segs + 1

print "Simulation: "
print segs
print ""
print "Theory: "
print max * 2 / (1+spread)
Output of a few runs:

> python segs.py
Simulation:
19993

Theory:
20000

> python segs.py
Simulation:
19950

Theory:
20000

> python segs.py
Simulation:
20062

Theory:
20000

> python segs.py
Simulation:
20022

Theory:
20000

> python segs.py
Simulation:
20047

Theory:
20000
I don't know about you, but that seems to me to be running pretty close to \frac{T}{I}. And trying it with different parameters doesn't seem to change that:

Spread = 9:
Simulation:
1999124

Theory:
2000000

Spread = 99:
Simulation:
200303

Theory:
200000

Spread = 9999:
Simulation:
2003

Theory:
2000
The question is, what we do practice or want we do theorycrafting. For practice are simple rules of thumb sufficient and often used for raiding. But my understanding is, that this is elitist jerks and the elite are not afraid of infinity sums nor Illidan either. So my target is to discuss how far the model reach and when/what approximations are useful.
Well, I agree that the problems are to some extent interesting in their own right; but I'd also argue that, particularly when writing a quick reference document, something that can be incorporated into a class modeling spreadsheet is more useful than something that can't. If we do come up with an exact solution, I'll happily throw in a mention of it and mark what I have as the easy-to-use approximation. But I think we're an extremely long way from having an exact solution, as we haven't even touched on the notion of attack distribution yet; most of these assume that they're either perfectly periodic or totally random (and sometimes, both in the same derivation) - when, in truth, they're not. So even assuming you're correct about the summation (which I don't think you are), and that you come up with a closed form approximation of it (which I expect to be hard)... it'll *still* just be an approximation. Which doesn't make it useless by any means - it's just not immediately clear to me that it's necessarily more useful than the stated one.
 
User is offline.
Reply With Quote
Old 04/14/08, 6:38 PM   #15 (permalink)
Glass Joe
 
Human Mage
 
Mal'Ganis
Band of the Eternal Sage exhibits the same properties as the Band of the Eternal Champion , that is 1ppm and 60s internal Cool down
 
User is offline.
Reply With Quote
Old 04/17/08, 3:44 PM   #16 (permalink)
F12
 
Vulajin's Avatar
 
Troll Rogue
 
Mal'Ganis
Originally Posted by Dontmindme View Post
Correct formula should be:

U = D / (c + 1/2v + 1/vp)

where 1/2v = your average time until your next attack
I don't believe this is necessary because the 1/vp term already incorporates the average likelihood that swings do or not do not occur in the second immediately following the cooldown's expiry.

Originally Posted by Sancus
I thought my guild was full of bickering retards. Thanks, Serious Casual, for showing me how wrong I was!
 
User is online.
Reply With Quote
Old 04/20/08, 5:30 AM   #17 (permalink)
Glass Joe
 
Gilmoshar's Avatar
 
Dwarf Priest
 
Draenor
I confirm the uptime formula as above, using Markov chains and Mathematica. (How dare you retroactively plagiarize my unpublished notes!) Only, as regards the input of Dontmindme, perhaps it's best to use, instead of the product cv, simply the number of missed proc opportunities in the internal cooldown? After all, any variance in the internal cooldown between proc opportunities is basically invisible. The difference is basically a floor function somewhere in the denominator.

Further, since what matters to the uptime is the number of times an attack sees it, perhaps it's best to modify the duration term as well -- so the number of attacks within the duration. Though that's mostly nitpicking on my part.

The formula as appears in my notes is

 \frac{np}{mp+1}

where p is the probability of proccing the buff on any given swing, m is the number of proc opportunities inside the given cooldown, and n is the number of proc opportunities in the duration of the buff. Strictly speaking this is the probability that any given proc opportunity will be made with the buff up, which is what I was gunning for. I'd give my derivation, but you seem to have things pretty well in hand. (And my exposition would suffer for lack of a chalkboard anyways. :P)

Further, for completeness, the analogous quantity for a theorized proc with a duration greater than its internal cooldown is

 1 - \frac{(1-p)^{n-m}}{mp+1}
 
User is offline.
Reply With Quote
Old 04/21/08, 12:50 AM   #18 (permalink)
King Hippo
 
Dwarf Rogue
 
Icecrown
Originally Posted by Vulajin View Post
I don't believe this is necessary because the 1/vp term already incorporates the average likelihood that swings do or not do not occur in the second immediately following the cooldown's expiry.
Actually it does not. 1/vp is the correct average time until the next proc starting at time 0.

With uneven numbers, there is a gap until the next eligible attack. In essence, the cooldown is not actually 20 seconds but 20 seconds plus the time interval until you have another attack. And actually, looking at my notes, I see an error. It should be -1/2v not +1/2v. As the formula 1/vp is assuming a full interval until the next attack and what you are left with at the end of a cooldown is a partial interval.

In my example I'm representing that time interval as 1/2v which is the average time until another attack. In truth, if all attacks were perfectly clockwork, this factor would be something different (essentially whatever fraction of an attack that does not evenly fit into the cooldown period).

An easy way to test this is a simple example. You flip a coin 1 time per second. What is the average time until you get a heads? This can easily be calculated (and even charted) and the answer is 2 seconds. Now what happens if there is a 1.5 second cooldown until it "counts" a heads? The answer is 3 seconds not 3.5 seconds.
 
User is offline.
Reply With Quote
Old 04/21/08, 10:31 AM   #19 (permalink)
Von Kaiser
 
Dwarf Warrior
 
Argent Dawn (EU)
Shard of Contempt: 10%, 45 second internal cooldown
 
User is offline.
Reply With Quote
Old 04/23/08, 12:52 PM   #20 (permalink)
Glass Joe
 
Gilmoshar's Avatar
 
Dwarf Priest
 
Draenor
Originally Posted by Vulajin
I don't believe this is necessary because the 1/vp term already incorporates the average likelihood that swings do or not do not occur in the second immediately following the cooldown's expiry.
Originally Posted by Dontmindme View Post
Actually it does not. 1/vp is the correct average time until the next proc starting at time 0.
If I understand you properly, this would be important if the buff expired at a random time, and you needed to factor in the time it takes until the next proc opportunity. But the time at which the buff expires (in the approximation of constant uniform attack speed, which I assume we're considering since that's where our formulae are true) is never random; it's always the duration of the buff modulo the time between attacks. And the proper way to handle this is just to forget about any buff duration between attacks, and count the number of proc opportunities made with the buff up (or with the internal cooldown up).

Again if I understand you properly, the way to proceed consistent with your input would be to basically start over with a new model; either constant nonuniform attack speed (hard and complicated, but better) or with attacks falling randomly subject to certain rules (probably also hard, and I'm not certain it's better.)

(Do we have a derivation for the formula under one of those approximations? If so, can you direct me to it?)
 
User is offline.
Reply With Quote
Old 04/23/08, 3:30 PM   #21 (permalink)
Bald Bull
 
Night Elf Rogue
 
Proudmoore
I think the way that most of us (by which I mean certainly myself, and probably DMM and Vulajin as well) are thinking about it is as follows:

After the cooldown completes, you are somewhere between two attacks. If attacks were perfectly periodic, you could figure out exactly where you'd be between two. But, alas, attacks aren't perfectly periodic - not even close. For casting spells they may be somewhat close (modulo the player's ability to cast spells perfectly end-to-end), but for melee attacks, they're really not. Never mind the fact that even straight autoattacking with a single weapon you'll see more variance in the time between consecutive attacks than you might guess, there's also the fact that MH attacks are muddied by SS procs, WF procs, and instant attacks, plus the fact that various haste procs and activated abilities means the spacing between consecutive attacks is anything but constant in the long run.

At this point, there are two schools of thought:

1) For attacks that are roughly periodic - OH attacks, and probably spellcasting as well - one assumes they're periodic but that the proc cooldown comes up at a random point in time between two attacks. Thus, the time till first eligible proccing attack is, on average, 1/2v, and then there's another chance to proc every 1/v units of time thereafter. When you total this up, you find that the expected time from end-of-cooldown to first proc is 1/vp-1/2v (which I think is what DMM was going for). This is probably a reasonable approximation of the offhand/chaincasted spell case.

2) For MH attacks, however, it seems to me that attacks are just too irregular for the periodicity assumption to hold - this is why I've defined v the way I have. If things were always (roughly) periodic, it would make more sense to define f = average time between attacks and use that. But, with procs and instant attacks - or procs that affect both hands, such that you have all that plus 2 interweaving roughly periodic attacks - periodicity doesn't really apply. Thus, I operate off expected number of attacks in a given interval of time instead. Thus, when the cooldown is up... the following second is a second like any other, so there are an average of v attacks in that second, and thus a proc occurs with probability 1/pv in the first second, (1-1/pv)*1/pv in the second second, and so on; adding this up gives the expected time till first proc after the cooldown as 1/pv, as per my original equation.

Which is the better way of modeling stuff in general? Hard to say. I chose option 2 because it's a simpler expression, and, frankly, the difference between the two is unlikely to be relevant. But as it's still an approximation, I'm not averse to other options if peop