[Article] Pseudo Random Distribution

Discussion in 'Advanced Mechanics Guides' started by Adra, Jul 2, 2009.

  1. Adra

    Adra Active Member

    Overview
    A Pseudo Random Distribution refers to the Warcraft III engine's dynamic probability calculations for certain percentage-based attack modifiers. Rather than using a static percentage, the probability is first set to a small initial value, then gradually increased with each consecutive attack for which the modifier does not occur. The probability then drops back to the initial value when the attack modifier does apply. Not only does this system make long strings of successful modifiers unlikely, but it also makes going an entire game without an attack modifier occurring impossible, as eventually the dynamic probability exceeds 100% and "forces" a modifier on the next attack. The distribution of attack modifiers is therefore not truly random, hence the term Pseudo Random Distribution. In general, all abilities that are rounded to the nearest 5% in the Warcraft III engine follow this probability distribution.

    Pseudo Random Abilities
    The list of all currently known base abilities that follow this system of balanced randomness is shown below. Triggered abilities notably do not fall in this list.
    • Critical Strike (ex. Phantom Assassin’s Coup de Grace, Crystalys)
    • Bash (ex. Faceless Void’s Time Lock. As of its remake, Cranium Basher does not follow this distribution.)
    • Pulverize (ex. Infernal’s Flaming Fists, Tidehunter’s Anchor Smash)
    • Orb of Slow (ex. Maim, Maelstrom)
    • Hardened Skin (ex. Stout Shield, Vanguard)
    Probability Mechanics
    Critical Strike Example
    Consider the case of a 20% chance to Critical Strike. If the game were truly random, then for each attack there would be a 20% chance for the unit to land a Critical Strike, regardless of how many Critical Strikes had been performed in the past. A simple implementation would therefore be to select a random integer between 1 and 100, and if the integer was less than or equal to 20, then the engine would cause that attack to be a Critical (which is the usual construct used by triggered percentage-based abilities). While this implementation would, in the long run, average out to 20% of attacks being Criticals, there is nothing preventing an infinite series of Critical Strikes or, conversely, an absence of Critical Strikes for the entire game, although the chance is rather insignificant. To prevent the ensuing complaints and balance this random game mechanic, the Warcraft III developers implemented a Pseudo Random Probability Distribution.

    Instead of there being a 20% chance to Critical Strike with every attack, the first attack made actually has a 5.57% chance to Critical Strike. If that is not a Critical Strike, then the second attack has a 11.14% chance to Critical. If that is also not a Critical Strike, then the third has a 16.71% chance to Critical, and so on, adding 5.57% for each consecutive non-Critical. When a Critical Strike does occur, however, the chance for the next attack resets to 5.57%. In the long run, the number of Critical Strikes divided by the total number of attacks somewhat approximates the stated 20%, but now it is extremely difficult to have a series of Critical Strikes, and also impossible to go more than 17 attacks without a Critical, because the percentage for the 18th attack (assuming 17 previous consecutive non-Critical attacks) is 100.26%. In effect, the game causes the number of attacks between Criticals to be skewed towards 1 / 20% = 5, with a maximum limit of 17.

    The following sections deal with specific mechanics of the PRD. It is very long, and probably very boring too, unless you enjoy math and/or coding. For everyone else, feel free to skip down to the Summary section at the end.

    Probability Formula
    For all of the abilities stated above, the Warcraft III engine uses an initial percentage (%) value that linearly increases with each consecutive attack for which the attack modifier does not apply. The probability formula for an attack modifier to occur is therefore:
    Code:
    P(N) = C * N
    In this formula, P(N) is the % probability for the modifier to occur on the Nth attack, N is the number of attacks since the last attack modifier (minimum value of 1), and C is a constant that serves as both the initial % and the increase in % with each attack. Since this is a linear formula, when N reaches a high enough value, P(N) will exceed 1 and the next attack is guaranteed to have an attack modifier. Simple algebra shows this N value to be equal to 1 / C. The value of C in turn depends on the probability stated in the World Editor for that skill; for the rest of this article, this stated probability will be referred to as P(E), the expected probability.

    Pseudo Random Probability Constants
    Two tables of C values are shown below. P(E) is the expected probability, C is the constant, and the maximum number of consecutive attacks that can occur without the attack modifier is listed under Max N. So for a Critical Strike with a value of 45%, a series of four normal attacks can occur, but the fifth attack will then have to be a Critical. This first table represents the theoretical C values for every multiple of 5%, which were calculated using numerical methods (credits to ICallBotSolo and Cano Tolto).

    Theoretical Probability Constants
    [TABLE]P(E) | C | Max N
    -----|--------|------
    5% | 0.00380 | 263
    10% | 0.01475 |67
    15% | 0.03222 |31
    20% | 0.05570 |17
    25% | 0.08474 |11
    30% | 0.11895 |8
    35% | 0.15798 |6
    40% | 0.20155 |4
    45% | 0.24931 |4
    50% | 0.30210 |3
    55% | 0.36040 | 2
    60% | 0.42265 | 2
    65% | 0.48113 | 2
    70% | 0.57143 | 1
    75% | 0.66667 | 1
    80% | 0.75000 | 1
    85% | 0.82353 | 1
    90% | 0.88889 | 1
    95% | 0.94737 | 1
    [/table]

    These theoretical probability constants do not match the ones that Blizzard employs, however, with serious consequences that will soon be made clear. This next table lists the C values that the WC3 engine appears to use, along with the corresponding actual probability. These values were estimated from experiments involving upwards of a million attacks.

    Actual Probability Constants
    [TABLE]P(E) | C | Max N | P(Actual)
    -----|--------|------|--------
    5% |0.00380 |263|5%
    10%|0.01475 |67|10%
    15%|0.03221 |31|15%
    20%|0.05570 |17|20%
    25%|0.08475 |11|24.9%
    30%|0.11895 |8|29.1%
    35%|0.14628|6|33.6%
    40%|0.18128 |5|37.8%
    45%|0.21867 |4|41.6%
    50%|0.25701|3|45.7%
    55%|0.29509|3|49.4%
    60%|0.33324|3|53.0%
    65%|0.38109|2|56.4%
    70%|0.42448|2|60.1%
    75%|0.46134|2|63.2%
    80%|0.50276|1|66.7%
    85%|0.57910|1|70.3%
    90%|0.67068|1|75.0%
    95%|0.77041|1|81.3%
    [/table]

    The table below has a side by side comparison of theoretical and actual values:

    Compiled Probability Constants
    [table]P(E) |Theoretical C |Actual C |Theoretical Max N |Actual Max N |P(Actual)
    -----|-------------|---------|-----------------|------------|--------
    5% |0.00380 |0.00380 |263 |263 |5.0%
    10% |0.01475 |0.01475 |67 |67 |10.0%
    15% |0.03222 |0.03221 |31 |31 |15.0%
    20% |0.05570 |0.05570 |17 |17 |20.0%
    25% |0.08474 |0.08475 |11 |11 |24.9%
    30% |0.11895 |0.11895 |8 |8 |29.1%
    35% |0.15798 |0.14628 |6 |6 |33.6%
    40% |0.20155 |0.18128 |4 |5 |37.8%
    45% |0.24931 |0.21867 |4 |4 |41.6%
    50% |0.30210 |0.25701 |3 |3 |45.7%
    55% |0.36040 |0.29509 |2 |3 |49.4%
    60% |0.42265 |0.33324 |2 |3 |53.0%
    65% |0.48113 |0.38109 |2 |2 |56.4%
    70% |0.57143 |0.42448 |1 |2 |60.1%
    75% |0.66667 |0.46134 |1 |2 |63.2%
    80% |0.75000 |0.50276 |1 |1 |66.7%
    85% |0.82353 |0.57910 |1 |1 |70.3%
    90% |0.88889 |0.67068 |1 |1 |75.0%
    95% |0.94737 |0.77041 |1 |1 |81.3%
    [/table]

    As the tables show, the actual and theoretical C values agree closely up to 30%, but then diverge sharply. In other words, the actual probability of attack modifiers is significantly lower than the expected probability as P(E) increases, a mistake that Blizzard has yet to correct.

    Probability Error
    For obvious reasons, the overall probability of the attack modifier occurring should be as close as possible to P(E). In other words, after an infinite series of attacks, the number of attack modifiers that occurred divided by the total number of attacks should ideally be equal to P(E). However, Warcraft III's Pseudo Random Distribution actually results in an overall probability that is less than P(E). While this negative deviation is insignificant at low P(E), differing by less than a percent for P(E) = 30%, the error increases sharply for higher percentages: a P(E) of 80% actually has a probability of only ~66.7%. This error likely results from two factors:
    1. A truncation in C. Without an infinite number of digits available for C, it is virtually impossible for a linear probability formula to accurately model a random distribution for a given P(E). Simply calculating C requires a significant amount of computing time, considering that it has to match an entire probability distribution to a single constant. This is the reason why all of the above skills are rounded to the nearest 5%: instead of dynamically calculating C as well, which would take up far too many CPU resources for each attack, the developers were able to create a static table of C values for 5%, 10%, 15%, ...95%, which could then be substituted into the above formula to determine P(N). The truncation of these defined values, which always results in smaller values, then leads to actual probabilities that are less than P(E). This effect should be nearly negligible for high C values, however, meaning that this cannot account for the significant errors seen at high P(E).
    2. Ladder P(E) values. Blizzard tailored Warcraft for Ladder play, not custom maps, and the highest P(E) in Ladder is the Tauren's Pulverize, with a probability of 25%. It is likely not a coincidence that the error in P(E) increases significantly after this point. When Blizzard implemented the PRD, they probably only calculated C values for the percentages that they knew they'd use in Ladder, and all other values were simply estimated from those results (e.g. with a fitted exponential curve). Apparently they didn't care to check whether those values actually worked, leading to the current situation.

    Probability Distribution
    To make the difference between the PRD and true random distributions even more clear, consider one of the above abilities with P(E) = 10%. The following graph shows the probability of getting an attack modifier on the Nth attack since the last modifier occurred, if the distribution were truly random. It is important to note that while the probability of getting an attack modifier for each individual attack is always 10% in a true random distribution, simply getting to the Nth attack without an attack modifier has only a (1 - P(E))^(N - 1) chance. So for N = 2, the probability is 0.09: 90% chance that the first (N = 1) attack was not an attack modifier, multiplied by the chance of getting a critical for the N = 2 attack (10% for all attacks in a true random mechanism).
    [​IMG]
    Note that the distribution follows a simple exponential formula, with a probability that steadily decreases by 0.1 with each consecutive attack.

    Now compare that graph with this Pseudo Random Distribution. This graph shows the same probability of getting an attack modifier on the Nth attack since the last modifier occurred, but with Warcraft III's Pseudo Random Distribution. Again, it is important to note that this graph does not show the individual probability of getting an attack modifier on the Nth attack (which is given by P(N) = C * N), but the product of P(N) and the chance that none of the previous N - 1 attacks have had a successful attack modifier.
    [​IMG]
    Note that the chance for the first attack is equal to the value of C for P(E) = 10%: 0.01475. The differences should be clear: there is a much lower chance of getting consecutive attack modifiers, the overall distribution is shifted to the right, and there is also a finite point at which the probability reaches 0, although not quite shown on this graph.

    Practical Implications
    Attack Counter
    The attack counter N is integral to the PRD, but its mechanics are not fully understood. Much of the following is inferred from observation and common sense, simply because we have no way of knowing exactly how Blizzard implemented the PRD. The counter does not increase when attacking units against whom the attack modifier cannot apply. So attacking an enemy building would not increase the chance of a Critical Strike or Bash on the first subsequent attack(s) on an enemy unit.

    For Orb of Slow-based abilities, the counter is not disabled during the cooldown period. This means that attacks made by the Spirit Bear during the cooldown of Entangle will greatly increase the chance of entangling as soon as the cooldown is over.

    Each pseudo random skill has its own attack counter, even if multiple skills of the same type are on the same hero. If multiple pseudo random skills proc at the same time but one overrides, both counters are reset nonetheless, e.g. in the case of two Critical Strikes. On a similar note, Illusions have their own attack counters for skills they inherit from the parent hero.

    Applications
    The Pseudo Random Distribution permeates all of gameplay, with some direct applications as well. A hero with a Critical Strike ability could fight creeps until a long string of non-Criticals occurred, then head into a team battle with an increased Critical Strike chance for his first attack(s). Such a tactic, while time consuming, could significantly increase the hero's DPS for that battle. The applications are even greater for heroes with an innate Bash skill, who could build up the same string of non-Bashes in order to maximize their chances of landing a Bash in the beginning of battle (remember that Cranium Basher does not follow the PRD). Furthermore, the fact that consecutive Bashes are discouraged by the Pseudo Random Distribution benefits Bash heroes greatly in that stun times will not overlap as much as in a true random distribution, making Permabashing a distinct possibility. Stacking attack speed items may therefore be feasible on these heroes, and especially for Syllabear’s Spirit Bear for the reason stated above.

    Summary
    The PRD is a built-in feature of the Warcraft III engine that balances many chance-based abilities to prevent too many or too few activations. Because of this system, players are guaranteed an attack modifier (ex. Critical Strike, Damage Block, Bash, etc) after a certain number of attacks. Every time an attack occurs and the modifier does not activate, the chance of the modifier activating in the future increases linearly; when the modifier does proc, however, the chance drops back to a low initial value. As a result, attack modifiers tend to occur non-consecutively and at more regular intervals. Due to a programming oversight by Blizzard, at percentages greater than 30%, attack modifiers regulated by the PRD activate less frequently than they should. The PRD does not affect Evasion or triggered skills such as Multicast and Starfall.

    See Also
    Forum Topics 219284 and 221292. In these forum topics, a slightly different formula is used in which N is defined as the number of in-between attacks, which has a minimum value of 0. For ease of comprehension, this article defines N as the number of attacks since the last attack modifier, with a minimum value of 1.


    Disclaimer:
    This article was originally written for the Dota-Allstars Wiki in October 2008. This subject was first researched in May 2008, but the person who said he'd write a guide about it never got around to it. So after realizing there still wasn't any consolidated guide or article about this fairly hefty game mechanic, I compiled all the information from the two forum topics and wrote this guide. I do not claim any of the findings as my own, nor do I take any credit for the testmaps, formulas, or findings from Malle, ICallBotSolo, 1239, and many others who contributed. The additions from Cano Tolto, Clogon, and 3DM@rk were invaluable in updating this article, as was the testmap from KileRatZ which was instrumental in estimating the actual probabilities and constants. Thanks to Wyvernoid for editing the first versions.

    Feedback, and especially corrections, would be greatly appreciated.
     
    Last edited by a moderator: Feb 28, 2016
  2. starfighter9

    starfighter9 Well-Known Member

    Nice, we can finally have something to direct people to rather than re-explain prd everytime someone posts a topic about it. IMO we should have this in the index on the mechanics page, or at least have it in the advanced mechanics guides section.
     
  3. IPlayForKeeps

    IPlayForKeeps Well-Known Member

    This guide is amazing to be honest it helped me a lot!!
     
  4. reh

    reh Well-Known Member

    That article was missing here, already loved it on DA.
    Very helpfull if some people go like "omg entangle luck, perma entangle wtfbbq".
    One link and it's clear, this time the thread looks even better.
     
  5. ImmolatusBurn

    ImmolatusBurn Well-Known Member

    Moved to Advanced Mechanics Guides.
     
  6. Ingolf

    Ingolf Well-Known Member

    Is it possible that you could summarize the guide near the end? I'm not very good with numbers and it's a long read for my old n' gray eyes :mellow:.
     
  7. Adra

    Adra Active Member

    Uh...the Overview at the very beginning summarizes pretty much everything that the casual gamer will care about. I'd at least recommend reading the "Critical Strike Example" to get the gist of it, the rest is math jumbo and specific mechanics.

    But yea, sure, I'll add a tl;dr disclaimer near the top.
     
  8. Steric

    Steric Well-Known Member

    Can the Orb of Slow-based ability activate if the ability is in cooldown, doing nothing but reseting the number of attacks since last activation?
     
  9. Adra

    Adra Active Member

    No. But we're still working out the kinks in Orb of Slow, it's pretty screwy.
     
  10. Cactrot

    Cactrot Well-Known Member

    PA's Blur evasion works the same way?
     
  11. Robzor

    Robzor Well-Known Member

    No, only six base abilities are known to behave in accordance to this pattern. These are;
    • Critical Strike
    • Pulverize
    • Hardened Skin
    • Bash
    • Orb of Slow
    • Demolish (never occurs in DotA)
     
  12. desOo

    desOo Well-Known Member

    I find this everiwhere, but I'm still too lazy to understand it.
     
  13. Cáno

    Cáno Well-Known Member

    Even though I'm credited (thanks!) here for this:
    Code:
     _____________________________________________________________ 
    |                            Results                          |
    |=============================================================|
    |   P(E): 0.01   |  C: 0.00016  |  N: 6250 | ERR:  0.00012648 |
    |   P(E): 0.02   |  C: 0.00062  |  N: 1613 | ERR: -0.00000141 |
    |   P(E): 0.03   |  C: 0.00139  |  N: 720  | ERR:  0.00004174 |
    |   P(E): 0.04   |  C: 0.00245  |  N: 409  | ERR:  0.00001194 |
    |   P(E): 0.05   |  C: 0.0038   |  N: 264  | ERR: -0.00001107 |
    |   P(E): 0.06   |  C: 0.00544  |  N: 184  | ERR: -0.00000059 |
    |   P(E): 0.07   |  C: 0.00736  |  N: 136  | ERR:  0.00000628 |
    |   P(E): 0.08   |  C: 0.00955  |  N: 105  | ERR: -0.00001036 |
    |   P(E): 0.09   |  C: 0.01202  |  N: 84   | ERR:  0.00001398 |
    |   P(E): 0.1    |  C: 0.01475  |  N: 68   | ERR:  0.00001454 |
    |   P(E): 0.11   |  C: 0.01774  |  N: 57   | ERR:  0.00001193 |
    |   P(E): 0.12   |  C: 0.02098  |  N: 48   | ERR: -0.00000956 |
    |   P(E): 0.13   |  C: 0.02448  |  N: 41   | ERR: -0.00000663 |
    |   P(E): 0.14   |  C: 0.02823  |  N: 36   | ERR:  0.00000091 |
    |   P(E): 0.15   |  C: 0.03222  |  N: 32   | ERR: -0.00000223 |
    |   P(E): 0.16   |  C: 0.03645  |  N: 28   | ERR: -0.00000523 |
    |   P(E): 0.17   |  C: 0.04092  |  N: 25   | ERR:  0.00000019 |
    |   P(E): 0.18   |  C: 0.04562  |  N: 22   | ERR: -0.00000028 |
    |   P(E): 0.19   |  C: 0.05055  |  N: 20   | ERR:  0.00000131 |
    |   P(E): 0.2    |  C: 0.0557   |  N: 18   | ERR: -0.00000765 |
    |   P(E): 0.21   |  C: 0.06108  |  N: 17   | ERR: -0.00000150 |
    |   P(E): 0.22   |  C: 0.06668  |  N: 15   | ERR:  0.00000627 |
    |   P(E): 0.23   |  C: 0.07249  |  N: 14   | ERR:  0.00000414 |
    |   P(E): 0.24   |  C: 0.07851  |  N: 13   | ERR: -0.00000178 |
    |   P(E): 0.25   |  C: 0.08474  |  N: 12   | ERR: -0.00000643 |
    |   P(E): 0.26   |  C: 0.09118  |  N: 11   | ERR: -0.00000524 |
    |   P(E): 0.27   |  C: 0.09783  |  N: 11   | ERR:  0.00000539 |
    |   P(E): 0.28   |  C: 0.10467  |  N: 10   | ERR: -0.00000035 |
    |   P(E): 0.29   |  C: 0.11171  |  N: 9    | ERR: -0.00000244 |
    |   P(E): 0.3    |  C: 0.11895  |  N: 9    | ERR:  0.00000110 |
    |   P(E): 0.31   |  C: 0.12638  |  N: 8    | ERR:  0.00000086 |
    |   P(E): 0.32   |  C: 0.134    |  N: 8    | ERR: -0.00000107 |
    |   P(E): 0.33   |  C: 0.14181  |  N: 8    | ERR:  0.00000605 |
    |   P(E): 0.34   |  C: 0.14981  |  N: 7    | ERR: -0.00000011 |
    |   P(E): 0.35   |  C: 0.15798  |  N: 7    | ERR: -0.00000378 |
    |   P(E): 0.36   |  C: 0.16633  |  N: 7    | ERR:  0.00000137 |
    |   P(E): 0.37   |  C: 0.17491  |  N: 6    | ERR:  0.00000086 |
    |   P(E): 0.38   |  C: 0.18362  |  N: 6    | ERR: -0.00000527 |
    |   P(E): 0.39   |  C: 0.19249  |  N: 6    | ERR:  0.00000450 |
    |   P(E): 0.4    |  C: 0.20155  |  N: 5    | ERR:  0.00000277 |
    |   P(E): 0.41   |  C: 0.21092  |  N: 5    | ERR: -0.00000005 |
    |   P(E): 0.42   |  C: 0.22036  |  N: 5    | ERR: -0.00000485 |
    |   P(E): 0.43   |  C: 0.2299   |  N: 5    | ERR:  0.00000140 |
    |   P(E): 0.44   |  C: 0.23954  |  N: 5    | ERR: -0.00000014 |
    |   P(E): 0.45   |  C: 0.24931  |  N: 5    | ERR:  0.00000310 |
    |   P(E): 0.46   |  C: 0.25987  |  N: 4    | ERR: -0.00000220 |
    |   P(E): 0.47   |  C: 0.27045  |  N: 4    | ERR: -0.00000280 |
    |   P(E): 0.48   |  C: 0.28101  |  N: 4    | ERR:  0.00000224 |
    |   P(E): 0.49   |  C: 0.29155  |  N: 4    | ERR: -0.00000217 |
    |   P(E): 0.5    |  C: 0.3021   |  N: 4    | ERR: -0.00000280 |
    |   P(E): 0.51   |  C: 0.31268  |  N: 4    | ERR:  0.00000322 |
    |   P(E): 0.52   |  C: 0.32329  |  N: 4    | ERR: -0.00000053 |
    |   P(E): 0.53   |  C: 0.33412  |  N: 3    | ERR:  0.00000012 |
    |   P(E): 0.54   |  C: 0.34737  |  N: 3    | ERR:  0          |
    |   P(E): 0.55   |  C: 0.3604   |  N: 3    | ERR:  0.00000161 |
    |   P(E): 0.56   |  C: 0.37322  |  N: 3    | ERR:  0.00000244 |
    |   P(E): 0.57   |  C: 0.38584  |  N: 3    | ERR:  0.00000030 |
    |   P(E): 0.58   |  C: 0.39828  |  N: 3    | ERR:  0.00000143 |
    |   P(E): 0.59   |  C: 0.41054  |  N: 3    | ERR: -0.00000375 |
    |   P(E): 0.6    |  C: 0.42265  |  N: 3    | ERR:  0.00000024 |
    |   P(E): 0.61   |  C: 0.4346   |  N: 3    | ERR: -0.00000375 |
    |   P(E): 0.62   |  C: 0.44642  |  N: 3    | ERR:  0.00000060 |
    |   P(E): 0.63   |  C: 0.4581   |  N: 3    | ERR: -0.00000381 |
    |   P(E): 0.64   |  C: 0.46967  |  N: 3    | ERR:  0.00000006 |
    |   P(E): 0.65   |  C: 0.48113  |  N: 3    | ERR:  0.00000399 |
    |   P(E): 0.66   |  C: 0.49248  |  N: 3    | ERR: -0.00000065 |
    |   P(E): 0.67   |  C: 0.50746  |  N: 2    | ERR: -0.00000119 |
    |   P(E): 0.68   |  C: 0.52941  |  N: 2    | ERR: -0.00000077 |
    |   P(E): 0.69   |  C: 0.55072  |  N: 2    | ERR: -0.00000220 |
    |   P(E): 0.7    |  C: 0.57143  |  N: 2    | ERR:  0.00000072 |
    |   P(E): 0.71   |  C: 0.59155  |  N: 2    | ERR:  0.00000036 |
    |   P(E): 0.72   |  C: 0.61111  |  N: 2    | ERR: -0.00000059 |
    |   P(E): 0.73   |  C: 0.63014  |  N: 2    | ERR:  0.00000161 |
    |   P(E): 0.74   |  C: 0.64865  |  N: 2    | ERR:  0.00000072 |
    |   P(E): 0.75   |  C: 0.66667  |  N: 2    | ERR:  0.00000191 |
    |   P(E): 0.76   |  C: 0.68421  |  N: 2    | ERR: -0.00000029 |
    |   P(E): 0.77   |  C: 0.7013   |  N: 2    | ERR:  0.00000077 |
    |   P(E): 0.78   |  C: 0.71795  |  N: 2    | ERR:  0.00000077 |
    |   P(E): 0.79   |  C: 0.73418  |  N: 2    | ERR:  0.00000173 |
    |   P(E): 0.8    |  C: 0.75     |  N: 2    | ERR:  0          |
    |   P(E): 0.81   |  C: 0.76543  |  N: 2    | ERR: -0.00000143 |
    |   P(E): 0.82   |  C: 0.78049  |  N: 2    | ERR:  0.00000143 |
    |   P(E): 0.83   |  C: 0.79518  |  N: 2    | ERR: -0.00000047 |
    |   P(E): 0.84   |  C: 0.80952  |  N: 2    | ERR: -0.00000262 |
    |   P(E): 0.85   |  C: 0.82353  |  N: 2    | ERR:  0.00000042 |
    |   P(E): 0.86   |  C: 0.83721  |  N: 2    | ERR:  0.00000048 |
    |   P(E): 0.87   |  C: 0.85057  |  N: 2    | ERR: -0.00000351 |
    |   P(E): 0.88   |  C: 0.86364  |  N: 2    | ERR:  0.00000280 |
    |   P(E): 0.89   |  C: 0.8764   |  N: 2    | ERR: -0.00000351 |
    |   P(E): 0.9    |  C: 0.88889  |  N: 2    | ERR:  0.00000095 |
    |   P(E): 0.91   |  C: 0.9011   |  N: 2    | ERR:  0.00000089 |
    |   P(E): 0.92   |  C: 0.91304  |  N: 2    | ERR: -0.00000298 |
    |   P(E): 0.93   |  C: 0.92473  |  N: 2    | ERR: -0.00000107 |
    |   P(E): 0.94   |  C: 0.93617  |  N: 2    | ERR: -0.00000017 |
    |   P(E): 0.95   |  C: 0.94737  |  N: 2    | ERR:  0.00000143 |
    |   P(E): 0.96   |  C: 0.95833  |  N: 2    | ERR: -0.00000303 |
    |   P(E): 0.97   |  C: 0.96907  |  N: 2    | ERR: -0.00000208 |
    |   P(E): 0.98   |  C: 0.97959  |  N: 2    | ERR: -0.00000178 |
    |   P(E): 0.99   |  C: 0.9899   |  N: 2    | ERR:  0.00000095 |
    |   P(E): 1      |  C: 1        |  N: 1    | ERR:  0          |
    |________________|______________|__________|__________________|
    I still quite don't get how to obtain these values using mathematical methods (this table is generated with a program I wrote, but it obtains the values with recursive function ran thousands of time - that's pretty retarded).

    These are two posts I don't get - by 3DM@rk and ICallBotSolo (unfortunately he's not active here).
    Could somebody define what exactly does the term numerical methods mean?

    Greets
    Cáno
     
    Last edited: Sep 16, 2009
  14. Adra

    Adra Active Member

    They mean numerical analysis, which is exactly what you did - approximating the actual value of C by recursively solving over a huge number of iterations. ICallBotSolo proposed that linear formula, then created a huge-ass excel sheet to do the actual work (though I might be remembering his results sheet instead, as I recall he worked with MATLAB a lot).

    As for 3DM@rk's post, I'm sure he would do a much better job explaining this, so bear with my longwinded explanation: At high percentages, N is low, so we know exactly how many attacks are possible. For P(E) = 100% (trivial case), we can construct the formula:
    Code:
    P(E) = 1 critical / (1 attack)
    So this formula states that we are guaranteed a [numerator, i.e. one] critical every [denominator] number of attacks. As P(E) drops and the number of possible attacks increases, we add terms to the denominator to denote the probability of additional attacks being needed. So for P(E) >= 0.7, N = 2 and we add the term (1 - C) to the denominator to describe the probability of reaching the second attack.
    Code:
    P(E) = 1 / (1 + (1 - C))
    P(E) = 1 / (2 - C)
    1 / P(E) = 2 - C
    C = 2 - 1 / P(E)
    
    For P(E) between 0.55 and 0.65, 3 attacks are possible, and we add the term (1 - C)*(1 - 2C) to the denominator.
    Code:
    P(E) = 1 / (1 + (1 - C) + (1 - C)*(1 - 2C))
    This simplifies to:
    Code:
    P(E) = 1 / (2*C^2 - 4*C + 3)
    We could continue doing this, adding terms to the denominator, but as you might imagine, the formula gets messy in a hurry with all the exponents.
     
    Last edited: Sep 16, 2009
  15. 3DM@rk

    3DM@rk Well-Known Member

    Adra explained pretty well everything.

    It's just applied theory of probability. P(E) expresses the average number of critical strikes per one attack.
    Let's examine the probabilities here:
    • (a) the probability, that the first attack is a Critical Strike, is C
    • (b) the probability, that the first attack was not a Critical Strike, is 1-C (complementary event)

    If C>=0.5, option (b) means that the second attack was a Critical strike.

    In point (a), we made one attack to score a critical strike (with probability C), in point (b), we had to make two attacks to score a critical strike (with probability 1-C).
    We have covered the whole sample space (for C>=0.5), so we can make a weighted mean to obtain 1/P(E), aka the average number of attacks per one Critical Strike:

    Code:
    1/P(E) = C*1 + (1-C)*2
    1/P(E) = C + 2 - 2*C
    1/P(E) = 2 - C
    By expressing C from the equation, we get:

    Code:
    C = 2 - 1/P(E)
    This formula is only valid if it yields C>=0.5, otherwise the initial assumption would be incorrect.

    For C<0.5, we need to add more summands to the weighted mean, making the equation more complicated (and of higher degree in C).
     
  16. Cáno

    Cáno Well-Known Member

    Thanks to both of you. It looks so logical when explained.
    The language is the greatest barrier in understanding maths related problems. Even these which shouldn't raise any doubts.

    Greets
    Cáno
     
  17. Uareanoob

    Uareanoob Well-Known Member

    Is javelin affected by PRD?
     
  18. Adra

    Adra Active Member

    Nope, Javelin's bonus damage is not based on any of the base abilities that follow PRD. Javelin's 20% chance to deal 40 bonus damage is completely triggered, and roughly goes like this: Whenever a unit is attacked, check the attacker's inventory for Javelin. For each Javelin found, generate a random integer from 1 to 100; if the integer is less than or equal to 20, then have the attacker deal 40 damage to the target. Note that this means Javelin actually triggers at the start of an attack (whereas PRD-affected skills all act at damage point Edit: To clarify, PRD skills are actually checked and the counter incremented/reset at the start of attacks, but the effect doesn't happen until damage point).
     
    Last edited: Dec 7, 2009
  19. Very_Octopus

    Very_Octopus Well-Known Member

    Nice article. I remember numerous threads where people complained where people had 20/20 or 0/20 multicasts in agame so I totally see the point why blizzard implemented it.

    It gives some possibilities to abuse it in dota, e.g. let's say I was attacking creeps with mortred and didn't get any criticals for some 10 hits so.. I should land a blink strike on enemy because I would have increased chance to proc a crit then.
     
  20. Black Isle

    Black Isle Well-Known Member

    Call it advanced tactic instead of abuse :) be cool.