m (→Sample Scenario (pre-{{ver|8.1}}): reference) |
(Adding categories) |
||
(46 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{Speculation}} |
{{Speculation}} |
||
+ | {{UpdateMe|If you see any wrong statements, please feel free to edit or write in the comment section what is incorrect.}} |
||
{{Infobox |
{{Infobox |
||
| Box title = Random number generator |
| Box title = Random number generator |
||
| image = RNGChangesFixed.png |
| image = RNGChangesFixed.png |
||
− | | caption = Coin flip test results from a more "random" RNG<ref name="steve_forum">https://forums.warframe.com/topic/128402-rng-algorithm-bugschanges/</ref> |
+ | | caption = Coin flip test results from a more "random" RNG<ref name="steve_forum">Rng Algorithm Bugs/changes forum post by [DE]Steve https://forums.warframe.com/topic/128402-rng-algorithm-bugschanges/</ref> |
}} |
}} |
||
'''Random number generation''' (or '''RNG''') is the generation of a sequence of numbers that cannot be reasonably predicted better than by a [[wikipedia:Randomness|random chance]], usually through a [[wikipedia:Random number generation|random-number generator]].<ref>https://en.wikipedia.org/wiki/Random_number_generation</ref> RNG is an essential feature in [[WARFRAME]] as it is involved in many components of the game such as graphics<ref name="steve_forum" />, weapon mechanics such as [[Critical Hit]]s, generation of mission [[Tile Sets]], and more. These game mechanics use varying degrees of randomness for performance purposes, with more rigorous methods taking longer to generate more "random" numbers as a tradeoff to computational speed.<ref name="steve_forum" /> |
'''Random number generation''' (or '''RNG''') is the generation of a sequence of numbers that cannot be reasonably predicted better than by a [[wikipedia:Randomness|random chance]], usually through a [[wikipedia:Random number generation|random-number generator]].<ref>https://en.wikipedia.org/wiki/Random_number_generation</ref> RNG is an essential feature in [[WARFRAME]] as it is involved in many components of the game such as graphics<ref name="steve_forum" />, weapon mechanics such as [[Critical Hit]]s, generation of mission [[Tile Sets]], and more. These game mechanics use varying degrees of randomness for performance purposes, with more rigorous methods taking longer to generate more "random" numbers as a tradeoff to computational speed.<ref name="steve_forum" /> |
||
Most importantly, RNG is essential to the core gameplay loop with obtaining in-game items. The drop chance of an item can determine its trade value and influence a player's means of obtaining it such as farming, [[trading]], or purchasing with in-game or real-world currency. This article will explain some details on RNG in relation to WARFRAME's [[Drop Tables]] and should only be used for educational purposes since these mechanics may not apply to WARFRAME in its current state. |
Most importantly, RNG is essential to the core gameplay loop with obtaining in-game items. The drop chance of an item can determine its trade value and influence a player's means of obtaining it such as farming, [[trading]], or purchasing with in-game or real-world currency. This article will explain some details on RNG in relation to WARFRAME's [[Drop Tables]] and should only be used for educational purposes since these mechanics may not apply to WARFRAME in its current state. |
||
+ | |||
− | {{LatestEdit}} |
||
==Generating Random Numbers== |
==Generating Random Numbers== |
||
<gallery> |
<gallery> |
||
Line 15: | Line 16: | ||
RNGChangesFixed.png|Best RNG, still deterministic but harder to discern pattern from human perspective; true RNG would have each result be independently drawn and not depend on previous results<ref name="steve_forum" /> |
RNGChangesFixed.png|Best RNG, still deterministic but harder to discern pattern from human perspective; true RNG would have each result be independently drawn and not depend on previous results<ref name="steve_forum" /> |
||
</gallery> |
</gallery> |
||
− | As in many video games, random numbers are not generated [[wikipedia:Nondeterministic_algorithm|non-deterministically]] since they use computational algorithms that give the ''appearance'' of a random sequence, also known as [[wikipedia:Pseudorandom number generator|pseudorandom number generators]]. To the human eye, these numbers may look random, but they are actually from [[wikipedia:Deterministic_algorithm|deterministic algorithms]]; under certain conditions and parameters, the algorithm will always return the same 'random' number. Throughout this article, the term "RNG" will refer to pseudorandom number generators. |
+ | As in many video games<ref>See [[#External Links]] for some examples of random number generators in other games</ref>, random numbers are not generated [[wikipedia:Nondeterministic_algorithm|non-deterministically]] since they use computational algorithms that give the ''appearance'' of a random sequence, also known as [[wikipedia:Pseudorandom number generator|pseudorandom number generators]]. To the human eye, these numbers may look random, but they are actually from [[wikipedia:Deterministic_algorithm|deterministic algorithms]]; under certain conditions and parameters, the algorithm will always return the same 'random' number. Throughout this article, the term "RNG" will refer to pseudorandom number generators. |
===RNG Fairness=== |
===RNG Fairness=== |
||
A RNG is considered 'fair' when the random numbers it outputs correspond or results to the expected drop chances over an '''extended period of time''' (e.g. hundreds of runs) or '''throughout a [[wikipedia:Statistical_population|population]]''' (in this case, WARFRAME's playerbase). Say one is trying to get {{WF|Gara Prime}}'s main blueprint from a Radiant {{Relic|Axi G6}}. According to the [[Drop Tables|official drop table repository]], the blueprint has a 10% chance of dropping so a single player would expect to get the blueprint after opening an average of {{MathText|1 / 10% = 10}} Radiant {{Relic|Axi G6}}. In the long term, say after opening 1,000 Radiant {{Relic|Axi G6}}, the player would expect to get an average of 100 Gara Prime blueprints. These expected number of runs/drop table rolls or expected number of rewards over a number of runs/drop table rolls would be accurate if the written drop chances actually reflected on actual drop chances calculated by the in-game RNG. With a large [[wikipedia:Sample_size_determination|sample size]], if any deviation from these values is not within [[wikipedia:Errors and residuals|statistical error]], then one could say that the 10% drop chance is "inaccurate". |
A RNG is considered 'fair' when the random numbers it outputs correspond or results to the expected drop chances over an '''extended period of time''' (e.g. hundreds of runs) or '''throughout a [[wikipedia:Statistical_population|population]]''' (in this case, WARFRAME's playerbase). Say one is trying to get {{WF|Gara Prime}}'s main blueprint from a Radiant {{Relic|Axi G6}}. According to the [[Drop Tables|official drop table repository]], the blueprint has a 10% chance of dropping so a single player would expect to get the blueprint after opening an average of {{MathText|1 / 10% = 10}} Radiant {{Relic|Axi G6}}. In the long term, say after opening 1,000 Radiant {{Relic|Axi G6}}, the player would expect to get an average of 100 Gara Prime blueprints. These expected number of runs/drop table rolls or expected number of rewards over a number of runs/drop table rolls would be accurate if the written drop chances actually reflected on actual drop chances calculated by the in-game RNG. With a large [[wikipedia:Sample_size_determination|sample size]], if any deviation from these values is not within [[wikipedia:Errors and residuals|statistical error]], then one could say that the 10% drop chance is "inaccurate". |
||
− | Note that one cannot directly conclude that the drop tables are wrong or accurate from statistical methods, just the observations are statistically different from the expected drop rates. Use statistical analysis as a starting point for more research to be done (more sampling or rigorous tests) or to scrutinize drop tables' accuracy. |
+ | Note that one cannot directly conclude that the drop tables are wrong or accurate from statistical methods (e.g. comparison of expected and observed count data using [[wikipedia:Chi-squared test|Chi-squared test]]), just the observations are statistically different from the expected drop rates. Use statistical analysis as a starting point for more research to be done (more sampling or rigorous tests) or to scrutinize drop tables' accuracy. There may be one or several reasons why your experience does not match expected rates: |
+ | *The displayed drop chances are inaccurate from in-game chances |
||
+ | *Players are farming the wrong mission/enemy or rolling the wrong drop table (like in the case of [[Disruption]] where squad performance affects whether or not a rotation reward pulls from A, B, or C drop table) |
||
+ | *There is a bug/issue with the game's RNG<ref>"Glen (our Tech Director) identified and fixed a serious distribution flaw with random number generation (RNG) in Warframe. While enemy drops were not seriously affected, a truncation in the random 'seed' within the mission reward script could result in a terrible chain of bad luck. While some players may have benefited from this (a chain of good luck) the distribution was terrible." - {{ver|10.6.2}} patch notes</ref><ref>{{ver|29.5.7}} fixed a short-lived issue on Ayatan Amber Star drop rates: "Fixed Ayatan Amber Stars dropping far less frequently than before Deimos Arcana."</ref> |
||
+ | *There is an external factor that is not accounted for that is manipulating drop chances/RNG (e.g. having a squad member with a [[Mod Drop Chance Booster]] active) |
||
+ | *The possiblility that a player is astronomically (un)lucky with their drops |
||
+ | *Player's [[wikipedia:Confirmation bias|confirmation bias]] through a relatively small sample size of drop experiences to support sweeping claims that drop tables are wrong |
||
===Seeding RNG=== |
===Seeding RNG=== |
||
Line 32: | Line 39: | ||
===Linear Congruential Generator=== |
===Linear Congruential Generator=== |
||
− | One of the algorithms WARFRAME |
+ | One of the algorithms WARFRAME uses for generating pseudo-random numbers is [https://web.archive.org/web/20180621131253/http://www.eternallyconfuzzled.com:80/tuts/algorithms/jsw_tut_rand.aspx Donald Knuth's version] of a [[wikipedia:Linear_congruential_generator|Linear Congruential Generator (LCG)]], scaling off '''[[#Rarity Weights|rarity weights]]''' that influence the drop chances of items in '''<code>/Lotus/Types/DropTables</code>''' (enemy drop tables) and '''<code>/Lotus/Types/Game/MissionDecks</code>''' (mission drop tables).<ref name="void_blog">Devove, FineNerds, & VoiD_Glitch. (n.d.). ''WARFRAME - Rarity Weights and "Random" Number Generation''. Retrieved from July 13, 2018 on VoiD_Glitch's Github (since takened down) [[RNG/Archived|Archived]] from the original on December 21, 2018.</ref><ref name="navarro">Navarro, J. (2016). ''Random Number Generation in Warframe''. Navarroj.me. https://navarroj.me/WarframeRNG.html [https://web.archive.org/web/20210710192743/https://navarroj.me/WarframeRNG.html Archived] from the original on July 10, 2021.</ref> |
Note that the following LCG formula only applies to endless missions that involve getting rewards over time, such as [[Defense]] and [[Survival]]. |
Note that the following LCG formula only applies to endless missions that involve getting rewards over time, such as [[Defense]] and [[Survival]]. |
||
Line 51: | Line 58: | ||
<pre> |
<pre> |
||
+ | 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, ... |
||
− | 1 |
||
− | 7 |
||
− | 1 |
||
− | 7 |
||
− | 1 |
||
− | 7 |
||
</pre> |
</pre> |
||
Line 116: | Line 118: | ||
===Normalization Visualization=== |
===Normalization Visualization=== |
||
− | The two bar visuals below will demonstrate rarity weightings before and after normalization in a situation where a drop table has only uncommon and rare rarity weightings assigned to its item drops. Notice how the normalized weightings take up the entire range of all possible values between 0 and 1 |
+ | The two bar visuals below will demonstrate rarity weightings before and after normalization in a situation where a drop table has only uncommon and rare rarity weightings assigned to its item drops. Notice how the normalized weightings take up the entire range of all possible values between 0 inclusive and 1 exclusive while maintaining the same relative size between the different rarity weight classes (i.e. the same 11:1 ratio is maintained between uncommon and rare drops before and after normalization). |
{| width=100% style="text-align:center;" |
{| width=100% style="text-align:center;" |
||
Line 295: | Line 297: | ||
|- |
|- |
||
! colspan=3 | 0.00 + 0.00 + 0.00 + 1.00 = 1 |
! colspan=3 | 0.00 + 0.00 + 0.00 + 1.00 = 1 |
||
⚫ | |||
+ | |} |
||
+ | |||
+ | ===Example of Other Rarity Weightings=== |
||
⚫ | |||
⚫ | |||
+ | |+ Evidence of different rarity weightings used in Isolation Vault Bounties<ref name="drop_table" /> |
||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
+ | | || colspan=2 | Final Stage |
||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
+ | | || Residual Shock || Uncommon (15.00%) |
||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
+ | | || Theorem Contagion || Uncommon (10.00%) |
||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
+ | | || 3X Scintillant || Rare (2.00%) |
||
+ | |- |
||
⚫ | |||
+ | |- |
||
⚫ | |||
+ | |- |
||
+ | |} |
||
+ | {| width=100% style="text-align:center;" |
||
+ | |+ Bar visualization using in-game representation of rarity weightings<ref>See [[:File:T1IsoVaultRewards.jpg]]</ref> |
||
+ | |- |
||
+ | | colspan=10 align="left" | ▾ 0 |
||
+ | | colspan=5 align="right" | 1 ▾ |
||
+ | |- |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | |||
⚫ | |||
+ | | style="background:white; color:black;" width=4% | <!--Necramech Thrusters--> |
||
+ | | style="background:lightgray; color:black;" width=3% | <!--Damaged Necramech Weapon Barrel--> |
||
+ | | style="background:white; color:black;" width=2% | <!--3X Scintillant--> |
||
+ | | style="background:lightgray; color:black;" width=0.5% | <!--2X Orokin Animus Matrix--> |
||
+ | | style="background:white; color:black;" width=0.5% | <!--Axi O5 Relic--> |
||
+ | |- |
||
⚫ | |||
+ | | style="background:#d1d0d1;" colspan=5 | |
||
+ | | style="background:#ece175;" colspan=6 | |
||
+ | |- |
||
⚫ | |||
+ | | colspan=5 | Uncommon (15% + 7.5% + 3.75% + 1.88% + 1.88% = 30.01%) |
||
+ | | colspan=6 | Rare (10% + 4% + 3% + 2% + 0.5% + 0.5% = 20%) |
||
|- |
|- |
||
|} |
|} |
||
==Rarity Classification== |
==Rarity Classification== |
||
+ | {{Main|Drop Tables#Rarity Classification}} |
||
{{#lsth:Drop Tables|Rarity Classification}} |
{{#lsth:Drop Tables|Rarity Classification}} |
||
Line 371: | Line 450: | ||
==<code>DropTables</code> Variables== |
==<code>DropTables</code> Variables== |
||
+ | The following are some variables that are present within <code>/Lotus/Types/DropTables</code> enemy [[Drop Tables]]. |
||
+ | |||
===Bias=== |
===Bias=== |
||
'''<code>[[wikipedia:Bias_(statistics)|Bias]]</code>''' is a variable exclusive to '''<code>DropTables</code>''' that unequally weighs items within '''<code>DropTables</code>''' (through a positive (+) or negative (-) value change), even if said items have identical rarity weights. Bias can be applied to specific items within a particular '''<code>DropTable</code>''' but is not global across all. The more bias an item has (larger value), the lower its drop chance is. Conversely, the less bias an item has (smaller value), the higher its drop chance. Additionally, because bias scales from the rarity weight that the item it is impacting is assigned to, items with rarity weights that hold more weight than others will still tend to drop more often, depending on the amount of bias that is present.<ref name="void_blog" /> |
'''<code>[[wikipedia:Bias_(statistics)|Bias]]</code>''' is a variable exclusive to '''<code>DropTables</code>''' that unequally weighs items within '''<code>DropTables</code>''' (through a positive (+) or negative (-) value change), even if said items have identical rarity weights. Bias can be applied to specific items within a particular '''<code>DropTable</code>''' but is not global across all. The more bias an item has (larger value), the lower its drop chance is. Conversely, the less bias an item has (smaller value), the higher its drop chance. Additionally, because bias scales from the rarity weight that the item it is impacting is assigned to, items with rarity weights that hold more weight than others will still tend to drop more often, depending on the amount of bias that is present.<ref name="void_blog" /> |
||
====Example of No Bias in Enemy Drop Tables==== |
====Example of No Bias in Enemy Drop Tables==== |
||
+ | [[File:EliteLancerCodex.jpg|thumb|right|400px]] |
||
{| class="wikitable" |
{| class="wikitable" |
||
|+ No bias<ref name="drop_table">Obtained from the official drop table repository https://www.warframe.com/droptables on 2021-07-06</ref> |
|+ No bias<ref name="drop_table">Obtained from the official drop table repository https://www.warframe.com/droptables on 2021-07-06</ref> |
||
Line 380: | Line 462: | ||
| [[Elite Lancer]] || colspan=2 | Mod Drop Chance: 3.00% |
| [[Elite Lancer]] || colspan=2 | Mod Drop Chance: 3.00% |
||
|- |
|- |
||
− | | || Revenge || Uncommon (25.29%) |
+ | | || {{M|Revenge}} || Uncommon (25.29%) |
|- |
|- |
||
− | | || Quickdraw || Uncommon (25.29%) |
+ | | || {{M|Quickdraw}} || Uncommon (25.29%) |
|- |
|- |
||
− | | || Redirection || Uncommon (25.29%) |
+ | | || {{M|Redirection}} || Uncommon (25.29%) |
|- |
|- |
||
− | | || Razor Shot || Uncommon (11.06%) |
+ | | || {{M|Razor Shot}} || Uncommon (11.06%) |
|- |
|- |
||
− | | || 50 Endo || Uncommon (11.06%) |
+ | | || 50 [[Endo]] || Uncommon (11.06%) |
|- |
|- |
||
− | | || Thunderbolt || Legendary (0.67%) |
+ | | || {{M|Thunderbolt}} || Legendary (0.67%) |
|- |
|- |
||
− | | || Undying Will || Legendary (0.67%) |
+ | | || {{M|Undying Will}} || Legendary (0.67%) |
|- |
|- |
||
− | | || Crossing Snakes || Legendary (0.67%) |
+ | | || {{M|Crossing Snakes}} || Legendary (0.67%) |
|- |
|- |
||
|} |
|} |
||
Line 416: | Line 498: | ||
| style="background:#ece175;" colspan=3 | |
| style="background:#ece175;" colspan=3 | |
||
|- |
|- |
||
− | | colspan=3 | Common (25.29% * 3 = 75.87%) |
+ | | colspan=3 | Common (25.29% * 3 = 75.87% ≈ 75.88%) |
− | | colspan=2 | Uncommon (11.06% * 2 = 22.12%) |
+ | | colspan=2 | Uncommon (11.06% * 2 = 22.12% ≈ 22.11%) |
| colspan=3 | Rare (0.67% * 3 = 2.01%) |
| colspan=3 | Rare (0.67% * 3 = 2.01%) |
||
|- |
|- |
||
|} |
|} |
||
− | *Note that drop chances shown in drop tables round to the nearest two decimal places. |
+ | *Note that drop chances shown in drop tables round to the nearest two decimal places, thus calculated rarity weightings may be off from the actual/expected numbers. |
*The rarity classifiers in the table considers only the final drop chance and has nothing to do with rarity weighting |
*The rarity classifiers in the table considers only the final drop chance and has nothing to do with rarity weighting |
||
<hr /> |
<hr /> |
||
Line 428: | Line 510: | ||
*Razor Shot and 50 Endo each have a 11.06% drop chance; {{MathText|11.06% * 2 = 22.12%}} which is close to the Uncommon rarity weighting after normalization |
*Razor Shot and 50 Endo each have a 11.06% drop chance; {{MathText|11.06% * 2 = 22.12%}} which is close to the Uncommon rarity weighting after normalization |
||
*Thunderbolt, Undying Will, and Crossing Snakes each have a 0.67% drop chance; {{MathText|0.67% * 3 = 2.01%}} which is close to the Rare rarity weighting after normalization |
*Thunderbolt, Undying Will, and Crossing Snakes each have a 0.67% drop chance; {{MathText|0.67% * 3 = 2.01%}} which is close to the Rare rarity weighting after normalization |
||
+ | |||
+ | Alternatively, if one has a [[Codex]] entry of a particular enemy completed, the reward drops shown will be color-coded based on the rarity weighting it used. See [[#Rarity Classification]] for more details. |
||
====Example of Bias in Enemy Drop Tables==== |
====Example of Bias in Enemy Drop Tables==== |
||
+ | [[File:EidolonTeralystCodex.jpg|thumb|right|400px]] |
||
{| class="wikitable" |
{| class="wikitable" |
||
|+ Bias<ref name="drop_table">Obtained from the official drop table repository https://www.warframe.com/droptables on 2021-07-06</ref> |
|+ Bias<ref name="drop_table">Obtained from the official drop table repository https://www.warframe.com/droptables on 2021-07-06</ref> |
||
Line 435: | Line 520: | ||
| [[Eidolon Teralyst]] || colspan=2 | Mod Drop Chance: 100.00% |
| [[Eidolon Teralyst]] || colspan=2 | Mod Drop Chance: 100.00% |
||
|- |
|- |
||
− | | || Lethal Momentum || Uncommon (22.22%) |
+ | | || {{M|Lethal Momentum}} || Uncommon (22.22%) |
|- |
|- |
||
− | | || Terminal Velocity || Uncommon (22.22%) |
+ | | || {{M|Terminal Velocity}} || Uncommon (22.22%) |
|- |
|- |
||
− | | || Fatal Acceleration || Uncommon (22.22%) |
+ | | || {{M|Fatal Acceleration}} || Uncommon (22.22%) |
|- |
|- |
||
− | | || Collision Force || Rare (8.33%) |
+ | | || {{M|Collision Force}} || Rare (8.33%) |
|- |
|- |
||
− | | || Pummel || Rare (8.33%) |
+ | | || {{M|Pummel}} || Rare (8.33%) |
|- |
|- |
||
− | | || Crash Course || Rare (8.33%) |
+ | | || {{M|Crash Course}} || Rare (8.33%) |
|- |
|- |
||
− | | || Full Contact || Rare (8.33%) |
+ | | || {{M|Full Contact}} || Rare (8.33%) |
|- |
|- |
||
|} |
|} |
||
Line 464: | Line 549: | ||
| style="background:lightgray; color:black;" width=8.33% | Full Contact |
| style="background:lightgray; color:black;" width=8.33% | Full Contact |
||
|- |
|- |
||
− | | style="background:# |
+ | | style="background:#d1d0d1;" colspan=3 | |
+ | | style="background:#ece175;" colspan=4 | |
||
|- |
|- |
||
− | | colspan= |
+ | | colspan=3 | Uncommon (22.22% * 3 = 66.66%) |
+ | | colspan=4 | Rare (8.33% * 4 = 33.32%) |
||
|- |
|- |
||
|} |
|} |
||
*Note that because drop chance percentages in the official drop table repository are rounded to the nearest two decimals, the total drop chance will not always add up to 100% exactly. |
*Note that because drop chance percentages in the official drop table repository are rounded to the nearest two decimals, the total drop chance will not always add up to 100% exactly. |
||
− | *Common rarity weight is a placeholder in the bar visualization. In reality, each item may use either the Uncommon, Rare, or Legendary weighting and the result would still be the same due to normalization of a single rarity weighting present in the drop table. |
||
====Another Example of Bias in Enemy Drop Tables==== |
====Another Example of Bias in Enemy Drop Tables==== |
||
+ | [[File:FeyarchSpecterCodex.jpg|thumb|right|400px]] |
||
{| class="wikitable" |
{| class="wikitable" |
||
|+ Bias<ref name="drop_table">Obtained from the official drop table repository https://www.warframe.com/droptables on 2021-07-06</ref> |
|+ Bias<ref name="drop_table">Obtained from the official drop table repository https://www.warframe.com/droptables on 2021-07-06</ref> |
||
Line 478: | Line 565: | ||
| [[Feyarch Specter]] || colspan=2 | Mod Drop Chance: 100.00% |
| [[Feyarch Specter]] || colspan=2 | Mod Drop Chance: 100.00% |
||
|- |
|- |
||
− | | || Shotgun Amp || Common (51.52%) |
+ | | || {{M|Shotgun Amp}} || Common (51.52%) |
|- |
|- |
||
− | | || Final Harbinger || Common (36.36%) |
+ | | || {{M|Final Harbinger}} || Common (36.36%) |
|- |
|- |
||
− | | || Empowered Blades || Rare (6.06%) |
+ | | || {{M|Empowered Blades}} || Rare (6.06%) |
|- |
|- |
||
− | | || High Noon || Rare (6.06%) |
+ | | || {{M|High Noon}} || Rare (6.06%) |
|- |
|- |
||
|} |
|} |
||
Line 498: | Line 585: | ||
| style="background:white; color:black;" width=6.06% | High Noon |
| style="background:white; color:black;" width=6.06% | High Noon |
||
|- |
|- |
||
− | | style="background:# |
+ | | style="background:#d1d0d1;" colspan=2 | |
+ | | style="background:#ece175;" colspan=2 | |
||
|- |
|- |
||
− | | colspan= |
+ | | colspan=2 | Uncommon (51.52% + 36.36% = 87.88%) |
+ | | colspan=2 | Rare (6.06% * 2 = 12.12%) |
||
|- |
|- |
||
|} |
|} |
||
Line 567: | Line 656: | ||
====Example of Bias in Bounties==== |
====Example of Bias in Bounties==== |
||
+ | [[File:Lvl10-30CetusBountyRotA.jpg|thumb|right|400px]] |
||
− | {{UpdateMe|Not exactly sure which items are in which rarity weighting, very convoluted; very possible that they all use the same rarity weighting and devs manually assign drop chances using some unknown system}} |
||
⚫ | |||
{| class="wikitable" |
{| class="wikitable" |
||
+ | |+ Bias in second Cetus bounty<ref>From official drop tables, retrieved 2021-10-31</ref> |
||
− | |+ Many biases involved<ref name="drop_table" /> |
||
|- |
|- |
||
− | | colspan=3 | Level |
+ | | colspan=3 | Level 10 - 30 [[Cetus]] Bounty |
|- |
|- |
||
| colspan=3 | Rotation A |
| colspan=3 | Rotation A |
||
|- |
|- |
||
− | | || colspan=2 | |
+ | | || colspan=2 | Stage 1 |
|- |
|- |
||
− | | || |
+ | | || Steel Fiber || Uncommon (25.00%) |
|- |
|- |
||
− | | || |
+ | | || 200X Oxium || Uncommon (25.00%) |
|- |
|- |
||
− | | || |
+ | | || 2,500 Credits Cache || Uncommon (25.00%) |
|- |
|- |
||
− | | || |
+ | | || 100 Endo || Uncommon (25.00%) |
|- |
|- |
||
+ | | || colspan=2 | Stage 2, Stage 3 of 4, and Stage 3 of 5 |
||
⚫ | |||
|- |
|- |
||
− | | || |
+ | | || Steel Fiber || Uncommon (15.08%) |
|- |
|- |
||
− | | || |
+ | | || 200X Oxium || Uncommon (15.08%) |
|- |
|- |
||
− | | || |
+ | | || 2,500 Credits Cache || Uncommon (15.08%) |
|- |
|- |
||
− | | || |
+ | | || 100 Endo || Uncommon (15.08%) |
|- |
|- |
||
− | | || |
+ | | || Gara Systems Blueprint || Rare (9.52%) |
|- |
|- |
||
− | | || |
+ | | || Charged Chamber || Rare (9.52%) |
|- |
|- |
||
− | | || |
+ | | || Burning Wasp || Rare (9.52%) |
|- |
|- |
||
− | | || |
+ | | || Lith B4 Relic || Uncommon (11.11%) |
|- |
|- |
||
− | | || |
+ | | || colspan=2 | Stage 4 of 5 |
|- |
|- |
||
− | | || |
+ | | || Steel Fiber || Uncommon (14.50%) |
|- |
|- |
||
− | | || |
+ | | || 200X Oxium || Uncommon (14.50%) |
|- |
|- |
||
+ | | || 2,500 Credits Cache || Uncommon (14.50%) |
||
⚫ | |||
⚫ | |||
− | |+ Many biases involved (ordered)<ref name="drop_table" /> |
||
|- |
|- |
||
+ | | || 100 Endo || Uncommon (14.50%) |
||
⚫ | |||
|- |
|- |
||
+ | | || Gara Systems Blueprint || Rare (9.16%) |
||
⚫ | |||
+ | |- |
||
+ | | || Charged Chamber || Rare (9.16%) |
||
+ | |- |
||
+ | | || Burning Wasp || Rare (9.16%) |
||
+ | |- |
||
+ | | || Lith B4 Relic || Uncommon (10.69%) |
||
+ | |- |
||
+ | | || 2X Control Module || Rare (3.82%) |
||
|- |
|- |
||
| || colspan=2 | Final Stage |
| || colspan=2 | Final Stage |
||
|- |
|- |
||
− | | || |
+ | | || Gara Systems Blueprint || Uncommon (21.82%) |
|- |
|- |
||
− | | || |
+ | | || Charged Chamber || Uncommon (21.82%) |
|- |
|- |
||
− | | || |
+ | | || Burning Wasp || Uncommon (21.82%) |
|- |
|- |
||
− | | || |
+ | | || Lith B4 Relic || Uncommon (25.45%) |
|- |
|- |
||
− | | || |
+ | | || 2X Control Module || Rare (9.09%) |
|- |
|- |
||
+ | |} |
||
⚫ | |||
+ | {| width=100% style="text-align:center;" |
||
+ | |+ Bar visualization of Stage 1 |
||
|- |
|- |
||
+ | | colspan=3 align="left" | ▾ 0 |
||
⚫ | |||
+ | | colspan=1 align="right" | 1 ▾ |
||
|- |
|- |
||
+ | | style="background:white; color:black;" width=25% | Steel Fiber |
||
⚫ | |||
+ | | style="background:lightgray; color:black;" width=25% | 200X Oxium |
||
+ | | style="background:white; color:black;" width=25% | 2,500 Credits Cache |
||
+ | | style="background:lightgray; color:black;" width=25% | 100 Endo |
||
|- |
|- |
||
+ | | style="background:#bd9177;" colspan=4 | |
||
⚫ | |||
|- |
|- |
||
+ | | colspan=4 | Common (25% * 4 = 100%) |
||
⚫ | |||
|- |
|- |
||
+ | |} |
||
⚫ | |||
+ | {| width=100% style="text-align:center;" |
||
+ | |+ Bar visualization of Stage 2, Stage 3 of 4, and Stage 3 of 5 |
||
|- |
|- |
||
+ | | colspan=5 align="left" | ▾ 0 |
||
⚫ | |||
+ | | colspan=3 align="right" | 1 ▾ |
||
|- |
|- |
||
+ | | style="background:white; color:black;" width=15.08% | Steel Fiber |
||
⚫ | |||
+ | | style="background:lightgray; color:black;" width=15.08% | 200X Oxium |
||
+ | | style="background:white; color:black;" width=15.08% | 2,500 Credits Cache |
||
+ | | style="background:lightgray; color:black;" width=15.08% | 100 Endo |
||
+ | | style="background:white; color:black;" width=9.52% | Gara Systems Blueprint |
||
+ | | style="background:lightgray; color:black;" width=9.52% | Charged Chamber |
||
+ | | style="background:white; color:black;" width=9.52% | Burning Wasp |
||
+ | | style="background:lightgray; color:black;" width=11.11% | Lith B4 Relic |
||
|- |
|- |
||
+ | | style="background:#bd9177;" colspan=4 | |
||
⚫ | |||
+ | | style="background:#d1d0d1;" colspan=4 | |
||
|- |
|- |
||
+ | | colspan=4 | Common (15.08% * 4 = 60.32%) |
||
⚫ | |||
+ | | colspan=4 | Uncommon (9.52% * 3 + 11.11% = 39.67%) |
||
|- |
|- |
||
+ | |} |
||
⚫ | |||
+ | {| width=100% style="text-align:center;" |
||
+ | |+ Bar visualization of Stage 4 of 5 |
||
+ | |- |
||
+ | | colspan=5 align="left" | ▾ 0 |
||
+ | | colspan=4 align="right" | 1 ▾ |
||
+ | |- |
||
+ | | style="background:white; color:black;" width=14.50% | Steel Fiber |
||
+ | | style="background:lightgray; color:black;" width=14.50% | 200X Oxium |
||
+ | | style="background:white; color:black;" width=14.50% | 2,500 Credits Cache |
||
+ | | style="background:lightgray; color:black;" width=14.50% | 100 Endo |
||
+ | | style="background:white; color:black;" width=9.16% | Gara Systems Blueprint |
||
+ | | style="background:lightgray; color:black;" width=9.16% | Charged Chamber |
||
+ | | style="background:white; color:black;" width=9.16% | Burning Wasp |
||
+ | | style="background:lightgray; color:black;" width=10.69% | Lith B4 Relic |
||
+ | | style="background:white; color:black;" width=3.82% | 2X Control Module |
||
+ | |- |
||
+ | | style="background:#bd9177;" colspan=4 | |
||
+ | | style="background:#d1d0d1;" colspan=4 | |
||
+ | | style="background:#ece175;" colspan=1 | |
||
+ | |- |
||
+ | | colspan=4 | Common (14.50% * 4 = 58%) |
||
+ | | colspan=4 | Uncommon (9.16% * 3 + 10.69% = 38.17%) |
||
+ | | colspan=1 | Rare (3.82%) |
||
|- |
|- |
||
|} |
|} |
||
{| width=100% style="text-align:center;" |
{| width=100% style="text-align:center;" |
||
− | |+ Bar visualization |
+ | |+ Bar visualization of Final Stage |
|- |
|- |
||
− | | colspan= |
+ | | colspan=3 align="left" | ▾ 0 |
− | | colspan= |
+ | | colspan=2 align="right" | 1 ▾ |
|- |
|- |
||
− | | style="background: |
+ | | style="background:white; color:black;" width=21.82% | Gara Systems Blueprint |
− | | style="background: |
+ | | style="background:lightgray; color:black;" width=21.82% | Charged Chamber |
− | | style="background: |
+ | | style="background:white; color:black;" width=21.82% | Burning Wasp |
− | | style="background: |
+ | | style="background:lightgray; color:black;" width=25.45% | Lith B4 Relic |
− | | style="background: |
+ | | style="background:white; color:black;" width=9.09% | 2X Control Module |
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
|- |
|- |
||
− | | style="background:# |
+ | | style="background:#d1d0d1;" colspan=4 | |
− | | style="background:# |
+ | | style="background:#ece175;" colspan=1 | |
⚫ | |||
|- |
|- |
||
− | | colspan= |
+ | | colspan=4 | Uncommon (21.82% * 3 + 25.45% = 90.91%) |
− | | colspan= |
+ | | colspan=1 | Rare (9.09%) |
⚫ | |||
|- |
|- |
||
|} |
|} |
||
+ | *Lith B4 Relic has a slight bias applied, making it more likely to drop than the rest of the rewards that use the uncommon rarity weighting. |
||
− | Notice that there are more than four classes of drop chances (0.50%, 1.88%, 2.00%, 3.00%, 3.75%, 4.00%, 6.25%, 7.50%, 10.00%, 12.50%, 25.00%) to correspond to the four rarity weightings; this means that there must be some bias involved to make different items more rarer than others that use the same rarity weighting. |
||
===Attenuation (global bias)=== |
===Attenuation (global bias)=== |
||
Line 690: | Line 813: | ||
==<code>MissionDecks</code> Variables== |
==<code>MissionDecks</code> Variables== |
||
+ | The following are some variables that are present within <code>/Lotus/Types/Game/MissionDecks</code> [[Mission Rewards]] tables. |
||
===Reward Seeds=== |
===Reward Seeds=== |
||
{{UpdateMe|"Despite the '''<code>SRand</code>''' variable (the seeding for the random number generator, a [[wikipedia:C_mathematical_functions#Random_number_generation|pseudo-random integer between 0 and <code>RAND_MAX</code>]])" does not match EE.log giving out a negative value for SRand}} |
{{UpdateMe|"Despite the '''<code>SRand</code>''' variable (the seeding for the random number generator, a [[wikipedia:C_mathematical_functions#Random_number_generation|pseudo-random integer between 0 and <code>RAND_MAX</code>]])" does not match EE.log giving out a negative value for SRand}} |
||
Line 738: | Line 862: | ||
On the next reward rotation, players will get a new random number depending on the seed. This new random number will be added to the initial seed. In other words, if the initial seed was 0.5, the interval picking number will be equal to {{MathText|0.5 + <code>increment</code>}}. However, this "random" value is the same for every checkpoint after due to truncation in the RNG.<ref name="steve_forum" /> For example, the 3rd reward rotation would be determined by {{MathText|0.5 + <code>increment</code> + <code>increment</code> or 0.5 + (2 * <code>increment</code>)}}. |
On the next reward rotation, players will get a new random number depending on the seed. This new random number will be added to the initial seed. In other words, if the initial seed was 0.5, the interval picking number will be equal to {{MathText|0.5 + <code>increment</code>}}. However, this "random" value is the same for every checkpoint after due to truncation in the RNG.<ref name="steve_forum" /> For example, the 3rd reward rotation would be determined by {{MathText|0.5 + <code>increment</code> + <code>increment</code> or 0.5 + (2 * <code>increment</code>)}}. |
||
− | The issue with this RNG is that it is more deterministic as one with this knowledge and the loot table drop chances (previously hidden from players until 2021-06-28 or just before {{ver|21}}<ref>https://forums.warframe.com/topic/809777-warframe-drop-rates-data/ - Warframe Drop Rates Data forum post</ref>) can determine their initial seed and on the 2nd reward rotation determine what increment is (approximately). By extension, one can calculate the approximate number of reward rotations until players get their desired reward. Another issue with this method is that players that rolled a low <code>increment</code> value may experience getting the same reward multiple reward rotations in a row; this is more prevalent if the player's first reward is a common item though it is possible for a player to receive consecutive rare drops with a very low increment value.<ref name="steve_forum" /> |
+ | The issue with this RNG is that it is more deterministic as one with this knowledge and the loot table drop chances (previously hidden from players until 2021-06-28 or just before {{ver|21}}<ref>https://forums.warframe.com/topic/809777-warframe-drop-rates-data/ - Warframe Drop Rates Data forum post</ref>) can determine their initial seed and on the 2nd reward rotation determine what increment is (approximately). By extension, one can calculate the approximate number of reward rotations until players get their desired reward. Another issue with this method is that players that rolled a low <code>increment</code> value may experience getting the same reward multiple reward rotations in a row; this is more prevalent if the player's first reward is a common item though it is possible for a player to receive consecutive rare drops with a very low or very high increment value.<ref name="steve_forum" /> |
===Sample Scenario (pre-{{ver|8.1}})=== |
===Sample Scenario (pre-{{ver|8.1}})=== |
||
Line 833: | Line 957: | ||
For example, in a pre-{{ver|8.1}} scenario where a player starts a Tier 3 Defense mission<ref name="reddit" />: |
For example, in a pre-{{ver|8.1}} scenario where a player starts a Tier 3 Defense mission<ref name="reddit" />: |
||
− | # At Wave 5, they get {{M|Heated Charge}}. Now they know their initial seed was between 0.1897 and 0.3794. The way this is determined is: |
+ | # At Wave 5, they get {{M|Heated Charge}}. Now they know their initial seed was between 0.1897 inclusive and 0.3794 exclusive. The way this is determined is: |
## Create an interval between 0 inclusive and 1 exclusive consisting of all the possible rewards (note that the sum of drop chances is 1 or 100%). For example, Hellfire is 0.0 - 0.1897, Heated Charge is 0.1897 - 0.3794, etc. |
## Create an interval between 0 inclusive and 1 exclusive consisting of all the possible rewards (note that the sum of drop chances is 1 or 100%). For example, Hellfire is 0.0 - 0.1897, Heated Charge is 0.1897 - 0.3794, etc. |
||
## Find out where the initial seed fits in and that is the item players will get. In this case, 0.1897 ≤ <code>initial_seed</code> < 0.3794 |
## Find out where the initial seed fits in and that is the item players will get. In this case, 0.1897 ≤ <code>initial_seed</code> < 0.3794 |
||
Line 840: | Line 964: | ||
#** If <code>initial_seed=0.2111</code> and <code>increment=0.1512</code>, then {{MathText|(0.2111 + 0.1512) mod 1 = 0.3623}} |
#** If <code>initial_seed=0.2111</code> and <code>increment=0.1512</code>, then {{MathText|(0.2111 + 0.1512) mod 1 = 0.3623}} |
||
#** If <code>initial_seed=0.3345</code> and <code>increment=0.8556</code>, then {{MathText|(0.3345 + 0.8556) mod 1 = 0.1901}} |
#** If <code>initial_seed=0.3345</code> and <code>increment=0.8556</code>, then {{MathText|(0.3345 + 0.8556) mod 1 = 0.1901}} |
||
+ | #** If <code>initial_seed=0.3793</code> and <code>increment=0.9999</code>, then {{MathText|(0.3793 + 0.9999) mod 1 = 0.3792}} |
||
# In order to get the Orokin Tier 3 Extermination key, the last drop in the table, players would need to get a value between 0.9985 inclusive and 1 exclusive. |
# In order to get the Orokin Tier 3 Extermination key, the last drop in the table, players would need to get a value between 0.9985 inclusive and 1 exclusive. |
||
#* 0.9985 ≤ {{MathText|<code>initial_seed</code> + (5 * <code>increment</code>) mod 1}} < 1 |
#* 0.9985 ≤ {{MathText|<code>initial_seed</code> + (5 * <code>increment</code>) mod 1}} < 1 |
||
− | #** If <code>initial_seed=0.2111</code> and <code>increment=0.1512</code>, then players will need to play at least 574 reward rotations to get their first key drop {{MathText|0.2111 + (574 * 0.1512) mod 1 = 0.9671}} |
+ | #** If <code>initial_seed=0.2111</code> and <code>increment=0.1512</code>, then players will need to play at least 574 reward rotations to get their first key drop<br />{{MathText|0.2111 + (574 * 0.1512) mod 1 = 0.9671}} |
− | #** If <code>initial_seed=0.3345</code> and <code>increment=0.8556</code>, then players will need to play at least 217 reward rotations to get their first key drop {{MathText|0.3345 + (217 * 0.8556) mod 1 = 0.9671}} |
+ | #** If <code>initial_seed=0.3345</code> and <code>increment=0.8556</code>, then players will need to play at least 217 reward rotations to get their first key drop<br />{{MathText|0.3345 + (217 * 0.8556) mod 1 = 0.9671}} |
+ | #** If <code>initial_seed=0.3793</code> and <code>increment=0.9999</code>, then players will need to play at least 3,794 reward rotations to get their first key drop, with the next 14 reward rotations also providing the key drop (15 consecutive rare rewards!)<br />{{MathText|0.3793 + (3794 * 0.9999) mod 1 = 0.9999}} |
||
<!--Not sure about the validity of this statement since the referenced Reddit post had the interval wrong for Orokin Tier 3 Extermination key: #* If their increment is big, the chance to hit 0.985 - 1.0 interval for the Orokin Tier 3 Extermination key is really small.--> |
<!--Not sure about the validity of this statement since the referenced Reddit post had the interval wrong for Orokin Tier 3 Extermination key: #* If their increment is big, the chance to hit 0.985 - 1.0 interval for the Orokin Tier 3 Extermination key is really small.--> |
||
Line 924: | Line 1,050: | ||
*https://limboh27.medium.com/implementing-weighted-rng-in-unity-ed7186e3ff3b - ''Implementing Weighted RNG in Unity'' by Harvey Limbo |
*https://limboh27.medium.com/implementing-weighted-rng-in-unity-ed7186e3ff3b - ''Implementing Weighted RNG in Unity'' by Harvey Limbo |
||
*https://blog.bruce-hill.com/a-faster-weighted-random-choice - ''A Faster Weighted Random Choice'' by Bruce Hill |
*https://blog.bruce-hill.com/a-faster-weighted-random-choice - ''A Faster Weighted Random Choice'' by Bruce Hill |
||
+ | *https://www.dev-notes.eu/2020/06/Pseudo-Random-Numbers-in-a-Range-and-Modulo-Bias/ - ''Pseudo Random Numbers in a Range and Modulo Bias'' by David Egan |
||
*https://lostgarden.home.blog/2014/12/08/loot-drop-tables/ - ''Loot Drop Tables'' by Daniel Cook |
*https://lostgarden.home.blog/2014/12/08/loot-drop-tables/ - ''Loot Drop Tables'' by Daniel Cook |
||
*https://www.youtube.com/watch?v=LWFzPP8ZbdU - ''Noise-Based RNG'' presented by Squirrel Eiserloh during Game Developers Conference 2017 |
*https://www.youtube.com/watch?v=LWFzPP8ZbdU - ''Noise-Based RNG'' presented by Squirrel Eiserloh during Game Developers Conference 2017 |
||
*https://www.youtube.com/watch?v=qO8FAQvlgX0 - ''Math for Game Programmers: Parallel Random Number Generation'' presented by Manny Ko during Game Developers Conference 2015 |
*https://www.youtube.com/watch?v=qO8FAQvlgX0 - ''Math for Game Programmers: Parallel Random Number Generation'' presented by Manny Ko during Game Developers Conference 2015 |
||
*https://www.youtube.com/watch?v=dwI5b-wRLic - ''The Two Types of Random in Game Design'' by Game Maker's Toolkit |
*https://www.youtube.com/watch?v=dwI5b-wRLic - ''The Two Types of Random in Game Design'' by Game Maker's Toolkit |
||
+ | |||
+ | ;In other games |
||
*https://forums.gearboxsoftware.com/t/vault-hunting-101-a-guide-to-rng-and-loot/1153869 - ''Vault Hunting 101: A Guide to RNG and LOOT!'' by VaultHunter101, RNG in [[wikipedia:Borderlands (series)|Borderlands]] series |
*https://forums.gearboxsoftware.com/t/vault-hunting-101-a-guide-to-rng-and-loot/1153869 - ''Vault Hunting 101: A Guide to RNG and LOOT!'' by VaultHunter101, RNG in [[wikipedia:Borderlands (series)|Borderlands]] series |
||
*https://bulbapedia.bulbagarden.net/wiki/Pseudorandom_number_generation_in_Pok%C3%A9mon - ''Pseudorandom number generation in Pokémon'' on Bulbapedia, the community-driven [[wikipedia:Pokémon|Pokémon]] encyclopedia |
*https://bulbapedia.bulbagarden.net/wiki/Pseudorandom_number_generation_in_Pok%C3%A9mon - ''Pseudorandom number generation in Pokémon'' on Bulbapedia, the community-driven [[wikipedia:Pokémon|Pokémon]] encyclopedia |
||
*https://www.youtube.com/watch?v=MiuLeTE2MeQ - ''RNG'' by UncommentatedPannen, about how RNG is used in [[wikipedia:Super Mario 64|Super Mario 64]] |
*https://www.youtube.com/watch?v=MiuLeTE2MeQ - ''RNG'' by UncommentatedPannen, about how RNG is used in [[wikipedia:Super Mario 64|Super Mario 64]] |
||
+ | *https://sinepost.wordpress.com/category/mathematics/probability/probability-in-game-design/ - Archive for the 'Probability in Game Design' Category by Neil Brown, featuring XCOM series |
||
==References== |
==References== |
||
Line 967: | Line 1,097: | ||
{{MechNav}} |
{{MechNav}} |
||
⚫ | |||
[[Category:Mechanics]] |
[[Category:Mechanics]] |
||
[[Category:Real-World References]] |
[[Category:Real-World References]] |
||
⚫ |
Revision as of 21:13, 27 November 2021
Random number generation (or RNG) is the generation of a sequence of numbers that cannot be reasonably predicted better than by a random chance, usually through a random-number generator.[2] RNG is an essential feature in WARFRAME as it is involved in many components of the game such as graphics[1], weapon mechanics such as Critical Hits, generation of mission Tile Sets, and more. These game mechanics use varying degrees of randomness for performance purposes, with more rigorous methods taking longer to generate more "random" numbers as a tradeoff to computational speed.[1]
Most importantly, RNG is essential to the core gameplay loop with obtaining in-game items. The drop chance of an item can determine its trade value and influence a player's means of obtaining it such as farming, trading, or purchasing with in-game or real-world currency. This article will explain some details on RNG in relation to WARFRAME's Drop Tables and should only be used for educational purposes since these mechanics may not apply to WARFRAME in its current state.
Generating Random Numbers
As in many video games[3], random numbers are not generated non-deterministically since they use computational algorithms that give the appearance of a random sequence, also known as pseudorandom number generators. To the human eye, these numbers may look random, but they are actually from deterministic algorithms; under certain conditions and parameters, the algorithm will always return the same 'random' number. Throughout this article, the term "RNG" will refer to pseudorandom number generators.
RNG Fairness
A RNG is considered 'fair' when the random numbers it outputs correspond or results to the expected drop chances over an extended period of time (e.g. hundreds of runs) or throughout a population (in this case, WARFRAME's playerbase). Say one is trying to get Gara Prime's main blueprint from a Radiant Axi G6. According to the official drop table repository, the blueprint has a 10% chance of dropping so a single player would expect to get the blueprint after opening an average of 1 / 10% = 10 Radiant Axi G6. In the long term, say after opening 1,000 Radiant Axi G6, the player would expect to get an average of 100 Gara Prime blueprints. These expected number of runs/drop table rolls or expected number of rewards over a number of runs/drop table rolls would be accurate if the written drop chances actually reflected on actual drop chances calculated by the in-game RNG. With a large sample size, if any deviation from these values is not within statistical error, then one could say that the 10% drop chance is "inaccurate".
Note that one cannot directly conclude that the drop tables are wrong or accurate from statistical methods (e.g. comparison of expected and observed count data using Chi-squared test), just the observations are statistically different from the expected drop rates. Use statistical analysis as a starting point for more research to be done (more sampling or rigorous tests) or to scrutinize drop tables' accuracy. There may be one or several reasons why your experience does not match expected rates:
- The displayed drop chances are inaccurate from in-game chances
- Players are farming the wrong mission/enemy or rolling the wrong drop table (like in the case of Disruption where squad performance affects whether or not a rotation reward pulls from A, B, or C drop table)
- There is a bug/issue with the game's RNG[4][5]
- There is an external factor that is not accounted for that is manipulating drop chances/RNG (e.g. having a squad member with a Mod Drop Chance Booster active)
- The possiblility that a player is astronomically (un)lucky with their drops
- Player's confirmation bias through a relatively small sample size of drop experiences to support sweeping claims that drop tables are wrong
Seeding RNG
It is unknown how WARFRAME generates the seed(s) for the random number generators that are used to determine drops from drop tables.
Weighted RNG
In a weighted random number generators, certain values will tend to appear more than others due to a bias (or weights) associated with those values. See #Rarity Weights and #Bias on how WARFRAME uses weighted values in their drop tables to make some rewards drop more frequently than others and vice versa.
Linear Congruential Generator
One of the algorithms WARFRAME uses for generating pseudo-random numbers is Donald Knuth's version of a Linear Congruential Generator (LCG), scaling off rarity weights that influence the drop chances of items in /Lotus/Types/DropTables
(enemy drop tables) and /Lotus/Types/Game/MissionDecks
(mission drop tables).[6][7]
Note that the following LCG formula only applies to endless missions that involve getting rewards over time, such as Defense and Survival.
Where is the sequence of pseudorandom values, and
- — "modulus", WARFRAME uses 1
- — "multiplier"
- — "increment", randomly chosen based on seed value
- — seed value for RNG
- — current iteration or reward rotation number, an integer
This type of RNG is cyclical in nature, meaning that after a certain number of iterations or period, the generator will return the same sequence of values, subsquently completing a "cycle".
For example, a LCG with a short period can be created using the following parameters[8]: m = 8, a = 3, c = 4, seed = 2147483647
The resultant sequence of numbers will look like:
1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, ...
In the cases of missions like Capture and Exterminate where players earn a reward upon mission completion, they simply use the process explained in #Reward Seeds and do not use LCG for random number generation.
Rarity Weights
WARFRAME uses four rarity weights in its RNG algorithm(s). These weights are the same across DropTables
and MissionDecks
, with the exception of /Lotus/Types/Game/MissionDecks/SortieRewards, which uses FixedWeights
that are manually assigned by the developers.[6][7]
Rarity | Weight | Percentage |
---|---|---|
Common | 0.755 | 75.50% |
Uncommon | 0.22 | 22.00% |
Rare | 0.02 | 2.00% |
Legendary | 0.005 | 0.50% |
0.755 + 0.22 + 0.02 + 0.005 = 1 |
Normalization
Normalization occurs when one or more of the rarity weights are not present in a DropTable
or MissionDeck
. It refers to the division of constants that are added up so values fall between zero (0) and one (1) within different data sets.[6]
Example Normalization Procedure
Say a drop table has 1 Common, 1 Uncommon, 1 Rare, and 0 Legendary drops. Normalize the rarity weightings by dividing by the sum of present rarity weightings in drop table to ensure weightings add up to 100% exactly. Common: 0.755 / (0.755 + 0.22 + 0.02) = 0.758793969849246 = 75.8793969849246% ≈ 75.88% Uncommon: 0.22 / (0.755 + 0.22 + 0.02) = 0.221105527638191 = 22.1105527638191% ≈ 22.11% Rare: 0.02 / (0.755 + 0.22 + 0.02) = 0.020100502512562 = 2.01005025125628% ≈ 2.01% 0.758793969849246 + 0.221105527638191 + 0.201005025125628 = 1 = 100%
Normalization Visualization
The two bar visuals below will demonstrate rarity weightings before and after normalization in a situation where a drop table has only uncommon and rare rarity weightings assigned to its item drops. Notice how the normalized weightings take up the entire range of all possible values between 0 inclusive and 1 exclusive while maintaining the same relative size between the different rarity weight classes (i.e. the same 11:1 ratio is maintained between uncommon and rare drops before and after normalization).
▾ 0 | 1 ▾ | |
22.00% Uncommon Drop | 2.00% Rare Drop | 76% No Item Drop |
▾ 0 | 1 ▾ |
91.6667% Uncommon Drop | 8.3333% Rare Drop |
Different Rarity Weightings after Normalization
Present Weights | Rarity | Normalized Weight | Percentage |
---|---|---|---|
All | Common | 0.755 | 75.50% |
Uncommon | 0.22 | 22.00% | |
Rare | 0.02 | 2.00% | |
Legendary | 0.005 | 0.50% | |
0.755 + 0.22 + 0.02 + 0.005 = 1 | |||
Common, Uncommon, and Rare | Common | 0.755 / (0.755 + 0.22 + 0.02) = 0.7587939698 | 75.88% |
Uncommon | 0.22 / (0.755 + 0.22 + 0.02) = 0.2211055276 | 22.11% | |
Rare | 0.02 / (0.755 + 0.22 + 0.02) = 0.0201005025 | 2.01% | |
Legendary | 0.00 | 0.00% | |
0.7588 + 0.2211 + 0.0201 + 0.00 = 1 | |||
Common, Uncommon, and Legendary | Common | 0.755 / (0.755 + 0.22 + 0.005) = 0.7704081633 | 77.04% |
Uncommon | 0.22 / (0.755 + 0.22 + 0.005) = 0.2244897959 | 22.45% | |
Rare | 0.00 | 0.00% | |
Legendary | 0.005 / (0.755 + 0.22 + 0.005) = 0.0051020408 | 0.51% | |
0.7704 + 0.2245 + 0.00 + 0.0051 = 1 | |||
Common, Rare, and Legendary | Common | 0.755 / (0.755 + 0.02 + 0.005) = 0.9679487179 | 96.79% |
Uncommon | 0.00 | 0.00% | |
Rare | 0.02 / (0.755 + 0.02 + 0.005) = 0.0256410256 | 2.56% | |
Legendary | 0.005 / (0.755 + 0.02 + 0.005) = 0.0064102564 | 0.64% | |
0.96795 + 0.00 + 0.02564 + 0.00641 = 1 | |||
Uncommon, Rare, and Legendary | Common | 0.00 | 0.00% |
Uncommon | 0.22 / (0.22 + 0.02 + 0.005) = 0.8979591837 | 89.80% | |
Rare | 0.02 / (0.22 + 0.02 + 0.005) = 0.0816326531 | 8.16% | |
Legendary | 0.005 / (0.22 + 0.02 + 0.005) = 0.0204081633 | 2.04% | |
0.00 + 0.8980 + 0.0816 + 0.0204 = 1 | |||
Common and Uncommon | Common | 0.755 / (0.755 + 0.22) = 0.7743589744 | 77.44% |
Uncommon | 0.22 / (0.755 + 0.22) = 0.2256410256 | 22.56% | |
Rare | 0.00 | 0.00% | |
Legendary | 0.00 | 0.00% | |
0.7744 + 0.2256 + 0.00 + 0.00 = 1 | |||
Common and Rare | Common | 0.755 / (0.755 + 0.02) = 0.9741935484 | 97.42% |
Uncommon | 0.00 | 0.00% | |
Rare | 0.02 / (0.755 + 0.02) = 0.0258064516 | 2.58% | |
Legendary | 0.00 | 0.00% | |
0.9742 + 0.00 + 0.0258 + 0.00 = 1 | |||
Common and Legendary | Common | 0.755 / (0.755 + 0.005) = 0.9934210526 | 99.34% |
Uncommon | 0.00 | 0.00% | |
Rare | 0.00 | 0.00% | |
Legendary | 0.005 / (0.755 + 0.005) = 0.0065789474 | 0.66% | |
0.9934 + 0.00 + 0.00 + 0.0066 = 1 | |||
Uncommon and Rare | Common | 0.00 | 0.00% |
Uncommon | 0.22 / (0.22 + 0.02) = 0.9166666667 | 91.67% | |
Rare | 0.02 / (0.22 + 0.02) = 0.0833333333 | 8.33% | |
Legendary | 0.00 | 0.00% | |
0.00 + 0.9167 + 0.0833 + 0.00 = 1 | |||
Uncommon and Legendary | Common | 0.00 | 0.00% |
Uncommon | 0.22 / (0.22 + 0.005) = 0.9777777778 | 97.78% | |
Rare | 0.00 | 0.00% | |
Legendary | 0.005 / (0.22 + 0.005) = 0.0222222222 | 2.22% | |
0.00 + 0.9778 + 0.00 + 0.0222 = 1 | |||
Rare and Legendary | Common | 0.00 | 0.00% |
Uncommon | 0.00 | 0.00% | |
Rare | 0.02 / (0.02 + 0.005) = 0.8 | 80% | |
Legendary | 0.005 / (0.02 + 0.005) = 0.2 | 20% | |
0.00 + 0.00 + 0.80 + 0.20 = 1 | |||
Common only | Common | 1.00 | 100% |
Uncommon | 0.00 | 0.00% | |
Rare | 0.00 | 0.00% | |
Legendary | 0.00 | 0.00% | |
1.00 + 0.00 + 0.00 + 0.00 = 1 | |||
Uncommon only | Common | 0.00 | 0.00% |
Uncommon | 1.00 | 100% | |
Rare | 0.00 | 0.00% | |
Legendary | 0.00 | 0.00% | |
0.00 + 1.00 + 0.00 + 0.00 = 1 | |||
Rare only | Common | 0.00 | 0.00% |
Uncommon | 0.00 | 0.00% | |
Rare | 1.00 | 100% | |
Legendary | 0.00 | 0.00% | |
0.00 + 0.00 + 1.00 + 0.00 = 1 | |||
Legendary only | Common | 0.00 | 0.00% |
Uncommon | 0.00 | 0.00% | |
Rare | 0.00 | 0.00% | |
Legendary | 1.00 | 100% | |
0.00 + 0.00 + 0.00 + 1.00 = 1 |
Example of Other Rarity Weightings
Level 30 - 40 Isolation Vault | ||
Rotation A | ||
Final Stage | ||
Residual Boils | Uncommon (25.00%) | |
Necramech Redirection | Uncommon (12.50%) | |
2X Orokin Orientation Matrix | Rare (6.25%) | |
Meso P4 Relic | Rare (6.25%) | |
Residual Shock | Uncommon (15.00%) | |
Necramech Steel Fiber | Rare (7.50%) | |
2X Orokin Ballistics Matrix | Rare (3.75%) | |
Neo D3 Relic | Ultra Rare (1.88%) | |
Neo T4 Relic | Ultra Rare (1.88%) | |
Theorem Contagion | Uncommon (10.00%) | |
Necramech Thrusters | Rare (4.00%) | |
Damaged Necramech Weapon Barrel | Rare (3.00%) | |
3X Scintillant | Rare (2.00%) | |
2X Orokin Animus Matrix | Legendary (0.50%) | |
Axi O5 Relic | Legendary (0.50%) |
▾ 0 | 1 ▾ | |||||||||||||
Residual Boils | Necramech Redirection | Residual Shock | Theorem Contagion | |||||||||||
Common (25% + 12.5% + 6.25% + 6.25% = 50%) | Uncommon (15% + 7.5% + 3.75% + 1.88% + 1.88% = 30.01%) | Rare (10% + 4% + 3% + 2% + 0.5% + 0.5% = 20%) |
Rarity Classification
- Main article: Drop Tables#Rarity Classification
In the official drop table repository, each possible reward that can be randomly pulled from a drop table has a rarity classification based on their individual drop chance. Rarity weighting is a separate concept independent from classification and is used by the game internally to calculate an item's individual drop chance.
Rarity Class | Drop Percentage Range | Possible Values In Drop Tables |
---|---|---|
Very Common | 60.00% ≤ x ≤ 100.00% | 100.00%, 91.67%, 86.44%, 77.78%, 77.44%, 75.50%, 68.18% |
Common | 33.33% ≤ x < 60.00% | 56.34%, 50.00%, 48.71%, 38.72%, 33.33% |
Uncommon | 10.00% ≤ x < 33.33% | 28.57%, 26.09%, 19.35%, 15.10%, 14.29%, 12.90%, 12.65%, 11.06%, 10.84%, 10.00% |
Rare | 2.00% ≤ x < 10.00% | 9.68%, 8.70%, 7.69%, 7.14%, 5.88%, 5.50%, 4.35%, 2.58%, 2.00% |
Ultra Rare | 1.00% < x < 2.00% | 1.84%, 1.58%, 1.36%, 1.01% |
Legendary | 0.10% < x ≤ 1.00% | 1.00%, 0.85%, 0.67%, 0.50%, 0.40%, 0.37%, 0.34%, 0.22%, 0.18% |
Beyond Legendary | x ≤ 0.10% | 0.00% (rounded to the nearest ten thousandths) |
However, in-game, rarity classification of rewards in Codex entries, Sortie menu, Bounty menus, and Void Relics use different systems that are visual in presentation and are based on internal rarity weights after normalization. This classification applies to all items in the same rarity rather than individual drop chances.
Rarity Weight | Approx. Color Scheme | Hex Code | Drop Percentage (rounded two decimals) |
---|---|---|---|
Common | #bd9177 | Varies based on rarity weightings present | |
Uncommon | #d1d0d1 | Varies based on rarity weightings present | |
Rare | #ece175 | Varies based on rarity weightings present | |
Total | 100% | ||
Common, Uncommon, and Rare present (e.g. Elite Lancer and most enemies) | |||
Common | #bd9177 | 75.88% | |
Uncommon | #d1d0d1 | 22.11% | |
Rare | #ece175 | 2.01% | |
Total | 100% | ||
Common and Uncommon only (e.g. Detron Crewman) | |||
Common | #bd9177 | 77.44% | |
Uncommon | #d1d0d1 | 22.56% | |
Rare | #ece175 | 0% | |
Total | 100% | ||
Common and Rare only | |||
Common | #bd9177 | 97.42% | |
Uncommon | #d1d0d1 | 0% | |
Rare | #ece175 | 2.58% | |
Total | 100% | ||
Uncommon and Rare only (e.g. Feral Kavat, Battalyst, Kela De Thaym) | |||
Common | #bd9177 | 0% | |
Uncommon | #d1d0d1 | 91.67% | |
Rare | #ece175 | 8.33% | |
Total | 100% | ||
Rare only (e.g. Torment, Corpus Cestra Target, Ved Xol) | |||
Common | #bd9177 | 0% | |
Uncommon | #d1d0d1 | 0% | |
Rare | #ece175 | 100% | |
Total | 100% | ||
Uncommon only (e.g. Demolisher Nox) | |||
Common | #bd9177 | 0% | |
Uncommon | #d1d0d1 | 100% | |
Rare | #ece175 | 0% | |
Total | 100% | ||
Common only (e.g. Kosma Gokstad Crewship, Vorac Crewship) | |||
Common | #bd9177 | 100% | |
Uncommon | #d1d0d1 | 0% | |
Rare | #ece175 | 0% | |
Total | 100% |
Note that an item's drop chance's rarity weighting may not be the same as the item's rarity classification. For example, in the drop table shown in #Example of No Bias, Revenge uses the Common rarity weighting in calculating its drop chance, but its resultant drop chance falls between 10.00% - 33.32% so the drop table repository refers to it as an "Uncommon" reward.
"Manipulating" RNG
WARFRAME offers some in-game ways to increase player's chances of getting certain rewards. These include:
- Using Void Traces to upgrade Void Relics' quality:
Quality | Traces | Common | Uncommon | Rare |
---|---|---|---|---|
Intact (default) | 0 | 76% (25.33% each) | 22% (11% each) | 2% |
Exceptional | 25 | 70% (23.33% each) | 26% (13% each) | 4% |
Flawless | 50 | 60% (20% each) | 34% (17% each) | 6% |
Radiant | 100 | 50% (16.67% each) | 40% (20% each) | 10% |
- Having an active Resource Drop Chance Booster to double the chance at which resource drop tables are rolled.
- Having an active Mod Drop Chance Booster to double the chance at which mod drop tables are rolled.
- Having an active True Master's Font Resource Drop Chance blessing for 25% increase at which resource drop tables are rolled.
- Playing any The Steel Path mission for +100% Resource Drop Chance and +100% Mod Drop Chance increase.
- Playing any Dark Sector missions for a Resource Drop Chance bonus ranging from +10% to +35% depending on the node.
- Using certain Warframe abilities (e.g. Nekros' Desecrate) to reroll enemy drop tables under certain conditions. See Drop Tables#Rerolling Drop Tables Mechanic for details.
- Having an active Chroma's Effigy for up to a 60% chance for enemies to drop additional Credits on kill.
- Completing all bonus objectives for each stage of a single Bounty will reward players with another roll of the final stage's drop table (containing Uncommon and Rare rarity rewards of the bounty).
- Using a Madurai Transmute Core, Naramon Transmute Core, or Vazarin Transmute Core to force the polarity of the resultant mod during Transmutation.
- Using mods of different rarities to increase the chance of a specific mod of a desired rarity during Transmutation. See Transmutation#Use for more details.
- When transmuting four Riven Mods, the resultant Riven Mod will always be of the same type as one of the transmuted Rivens.
Calculating an Item's Drop Chance
The following formulae are used to determine the base drop chance per item before introducing #Bias to individual items.
Example Procedure
Say a drop table has 8 Common, 6 Uncommon, 4 Rare, and 2 Legendary drops. The drop chances of each item rarity are (before presenting biases): Common: 0.755 / 8 = 0.094375 = 9.44% Uncommon: 0.22 / 6 = 0.0366666666667 = 3.67% Rare: 0.02 / 4 = 0.005 = 0.50% Legendary: 0.005 / 2 = 0.0025 = 0.25% Reversing operation to find chances of picking an item from a particular rarity tier: Common: 9.4375% × 8 = 75.5% Uncommon: 3.66666667% × 6 = 22% Rare: 0.5% × 4 = 2% Legendary: 0.25% × 2 = 0.5%
DropTables
Variables
The following are some variables that are present within /Lotus/Types/DropTables
enemy Drop Tables.
Bias
Bias
is a variable exclusive to DropTables
that unequally weighs items within DropTables
(through a positive (+) or negative (-) value change), even if said items have identical rarity weights. Bias can be applied to specific items within a particular DropTable
but is not global across all. The more bias an item has (larger value), the lower its drop chance is. Conversely, the less bias an item has (smaller value), the higher its drop chance. Additionally, because bias scales from the rarity weight that the item it is impacting is assigned to, items with rarity weights that hold more weight than others will still tend to drop more often, depending on the amount of bias that is present.[6]
Example of No Bias in Enemy Drop Tables
Elite Lancer | Mod Drop Chance: 3.00% | |
Revenge | Uncommon (25.29%) | |
Quickdraw | Uncommon (25.29%) | |
Redirection | Uncommon (25.29%) | |
Razor Shot | Uncommon (11.06%) | |
50 Endo | Uncommon (11.06%) | |
Thunderbolt | Legendary (0.67%) | |
Undying Will | Legendary (0.67%) | |
Crossing Snakes | Legendary (0.67%) |
▾ 0 | 1 ▾ | ||||||
Revenge | Quickdraw | Redirection | Razor Shot | 50 Endo | |||
Common (25.29% * 3 = 75.87% ≈ 75.88%) | Uncommon (11.06% * 2 = 22.12% ≈ 22.11%) | Rare (0.67% * 3 = 2.01%) |
- Note that drop chances shown in drop tables round to the nearest two decimal places, thus calculated rarity weightings may be off from the actual/expected numbers.
- The rarity classifiers in the table considers only the final drop chance and has nothing to do with rarity weighting
Notice that there is a clear distinction of different classes of items with the same drop chances. From here, one can deduce the rarity weightings each item used:
- Revenge, Quickdraw, and Redirection each have a 25.29% drop chance; 25.29% * 3 = 75.87% which is close to the Common rarity weighting after normalization
- Razor Shot and 50 Endo each have a 11.06% drop chance; 11.06% * 2 = 22.12% which is close to the Uncommon rarity weighting after normalization
- Thunderbolt, Undying Will, and Crossing Snakes each have a 0.67% drop chance; 0.67% * 3 = 2.01% which is close to the Rare rarity weighting after normalization
Alternatively, if one has a Codex entry of a particular enemy completed, the reward drops shown will be color-coded based on the rarity weighting it used. See #Rarity Classification for more details.
Example of Bias in Enemy Drop Tables
Eidolon Teralyst | Mod Drop Chance: 100.00% | |
Lethal Momentum | Uncommon (22.22%) | |
Terminal Velocity | Uncommon (22.22%) | |
Fatal Acceleration | Uncommon (22.22%) | |
Collision Force | Rare (8.33%) | |
Pummel | Rare (8.33%) | |
Crash Course | Rare (8.33%) | |
Full Contact | Rare (8.33%) |
▾ 0 | 1 ▾ | |||||
Lethal Momentum | Terminal Velocity | Fatal Acceleration | Collision Force | Pummel | Crash Course | Full Contact |
Uncommon (22.22% * 3 = 66.66%) | Rare (8.33% * 4 = 33.32%) |
- Note that because drop chance percentages in the official drop table repository are rounded to the nearest two decimals, the total drop chance will not always add up to 100% exactly.
Another Example of Bias in Enemy Drop Tables
Feyarch Specter | Mod Drop Chance: 100.00% | |
Shotgun Amp | Common (51.52%) | |
Final Harbinger | Common (36.36%) | |
Empowered Blades | Rare (6.06%) | |
High Noon | Rare (6.06%) |
▾ 0 | 1 ▾ | |||||
Shotgun Amp | Final Harbinger | Empowered Blades | High Noon | |||
Uncommon (51.52% + 36.36% = 87.88%) | Rare (6.06% * 2 = 12.12%) |
Example of Bias in End-of-Mission Rewards
Void Storm (Veil Proxima) | |
6X Corrupted Holokey | Uncommon (37.50%) |
1200 Endo | Uncommon (12.50%) |
Sevagoth Chassis Blueprint | Uncommon (10.00%) |
Sevagoth Neuroptics Blueprint | Uncommon (10.00%) |
Sevagoth Systems Blueprint | Uncommon (10.00%) |
Veil Resource Bundle | Rare (2.50%) |
Axi O5 Relic (Radiant) | Rare (2.50%) |
Axi A13 Relic (Radiant) | Rare (2.50%) |
Axi N7 Relic (Radiant) | Rare (2.50%) |
Axi T7 Relic (Radiant) | Rare (2.50%) |
Axi G6 Relic (Radiant) | Rare (2.50%) |
Axi C6 Relic (Radiant) | Rare (2.50%) |
Axi I1 Relic (Radiant) | Rare (2.50%) |
▾ 0 | 1 ▾ | ||||||||||||||
6X Corrupted Holokey | 1200 Endo | ||||||||||||||
Rare (37.50% + 12.50% + (10% * 3) = 80%) | Legendary (2.50% * 8 = 20%) |
Due to the drop table using only two rarity weightings (Rarity and Legendary), after #Normalization, Rare drop percentage is 2% / (2% + 0.5%) = 80% and Legendary is 0.5% / (2% + 0.5%) = 20%. Notice that despite 6X Corrupted Holokey, 1200 Endo, and Sevagoth's component blueprints using the Rare rarity weighting, they have different drop chances individually. This is due to bias involved to reduce/increase the drop chances of individual items. If there were no bias involved at all, we would expect each Rare item to have 80% / 5 items = 16% and each Legendary item to have 20% / 8 items = 2.5%.
Example of Bias in Bounties
Level 10 - 30 Cetus Bounty | ||
Rotation A | ||
Stage 1 | ||
Steel Fiber | Uncommon (25.00%) | |
200X Oxium | Uncommon (25.00%) | |
2,500 Credits Cache | Uncommon (25.00%) | |
100 Endo | Uncommon (25.00%) | |
Stage 2, Stage 3 of 4, and Stage 3 of 5 | ||
Steel Fiber | Uncommon (15.08%) | |
200X Oxium | Uncommon (15.08%) | |
2,500 Credits Cache | Uncommon (15.08%) | |
100 Endo | Uncommon (15.08%) | |
Gara Systems Blueprint | Rare (9.52%) | |
Charged Chamber | Rare (9.52%) | |
Burning Wasp | Rare (9.52%) | |
Lith B4 Relic | Uncommon (11.11%) | |
Stage 4 of 5 | ||
Steel Fiber | Uncommon (14.50%) | |
200X Oxium | Uncommon (14.50%) | |
2,500 Credits Cache | Uncommon (14.50%) | |
100 Endo | Uncommon (14.50%) | |
Gara Systems Blueprint | Rare (9.16%) | |
Charged Chamber | Rare (9.16%) | |
Burning Wasp | Rare (9.16%) | |
Lith B4 Relic | Uncommon (10.69%) | |
2X Control Module | Rare (3.82%) | |
Final Stage | ||
Gara Systems Blueprint | Uncommon (21.82%) | |
Charged Chamber | Uncommon (21.82%) | |
Burning Wasp | Uncommon (21.82%) | |
Lith B4 Relic | Uncommon (25.45%) | |
2X Control Module | Rare (9.09%) |
▾ 0 | 1 ▾ | ||
Steel Fiber | 200X Oxium | 2,500 Credits Cache | 100 Endo |
Common (25% * 4 = 100%) |
▾ 0 | 1 ▾ | ||||||
Steel Fiber | 200X Oxium | 2,500 Credits Cache | 100 Endo | Gara Systems Blueprint | Charged Chamber | Burning Wasp | Lith B4 Relic |
Common (15.08% * 4 = 60.32%) | Uncommon (9.52% * 3 + 11.11% = 39.67%) |
▾ 0 | 1 ▾ | |||||||
Steel Fiber | 200X Oxium | 2,500 Credits Cache | 100 Endo | Gara Systems Blueprint | Charged Chamber | Burning Wasp | Lith B4 Relic | 2X Control Module |
Common (14.50% * 4 = 58%) | Uncommon (9.16% * 3 + 10.69% = 38.17%) | Rare (3.82%) |
▾ 0 | 1 ▾ | |||
Gara Systems Blueprint | Charged Chamber | Burning Wasp | Lith B4 Relic | 2X Control Module |
Uncommon (21.82% * 3 + 25.45% = 90.91%) | Rare (9.09%) |
- Lith B4 Relic has a slight bias applied, making it more likely to drop than the rest of the rewards that use the uncommon rarity weighting.
Attenuation (global bias)
Attenuation
is a variable exclusive to DropTables
. The boolean OverrideLevelAdjustedBiasAtten
determines if attenuation is present in a DropTable
or not. As the attenuation value increases, the drop chance of an item should decrease. However, because of how minor its set value (0.5) is (from one of the boolean's secondary variables, RareAttenMax
), and that it impacts DropTables
globally instead of individual items, it is impossible to accurately determine if it has a noticeable impact on items at all.[6]
MissionDecks
Variables
The following are some variables that are present within /Lotus/Types/Game/MissionDecks
Mission Rewards tables.
Reward Seeds
SRand
variable (the seeding for the random number generator, a pseudo-random integer between 0 and RAND_MAX
)" does not match EE.log giving out a negative value for SRandrewardSeed
is a variable exclusive to MissionDecks
. It is a 64-bit signed integer that determines the missionReward
players receive at the end of a mission. It is granted to you by the game's servers at the start of the mission and remains with you until its completion. rewardSeeds
are given to the host, and members of the host's group receive the sessionId
in order to participate in the same matchmaking session. You will only receive a rewardSeed
when your client needs to distribute it to players in a group (as the host). This means that you will receive a rewardSeed
if you begin a Public, Friends Only, or Invite Only session, but if you begin a Solo session, you will not be given a rewardSeed
. Despite the SRand
variable (the seed for the random number generator) being different for each player, each player will always receive the same missionReward
as the host because of their identical sessionIds
.[6][12]
Examples of valid reward seeds:
5981559039678745352
-2947528797702211811
-1912700803863294092
-3758848590968623960
- Any value in the range of
−(2^63) to 2^63 − 1
or−9223372036854775808 to +9223372036854775807
inclusive
- Samples in EE.log
Note that when players start a matchmaking session, the rewardSeed will be set to -1
before being updated with a random value.
3.260 Sys [Diag]: SRand seeded with: -3443681654817279495 ... 4217.029 Net [Info]: MatchingServiceWeb::HostSession - settings: {"maxPlayers":4,"minPlayers":1,"privateSlots":0,"scoreLimit":15,"timeLimit":900,"gameModeId":0,"eloRating":28,"regionId":3,"difficulty":0,"hasStarted":false,"enableVoice":true,"matchType":"NORMAL","maps":[],"originalSessionId":"","usingPlayNow":false,"customSettings":"","rewardSeed":-1,"guildId":"","buildId":526217994,"freePublic":3,"freePrivate":0} ... 4217.154 Net [Info]: HostSessionCallback 4217.154 Net [Info]: sessionId=60e53502b0a65e27a219ad33 4217.154 Net [Info]: HostSessionDone (1, sessionId=60e53502b0a65e27a219ad33, rewardSeed=5981559039678745352) ... 4227.948 Net [Info]: NAT bound for client to <PLAYER_IP_ADDRESS>:4955 4228.005 Net [Info]: DeleteSessionCallback(1, {"sessionId":"60e53502b0a65e27a219ad33","rewardSeed":-2947528797702211811} 4228.005 Net [Info]: Deleted session ... 4231.370 Net [Info]: IRC out: QUIT :Logged out of game 4231.476 Net [Info]: DeleteSessionCallback(1, {"rewardSeed":-1912700803863294092} 4231.477 Net [Info]: Deleted session
Prior to Hotfix 10.6.2 (2013-11-05)
Prior to Hotfix 10.6.2 (2013-11-05) changes, WARFRAME's random number generator had a flawed distribution[1], resulting in abnormal number of streaks of bad/good luck in the reward drops compared to a more "randomly" distributed RNG. Recall that WARFRAME uses the following formula for RNG in endless missions:
Where is the sequence of pseudorandom values, and
- — "modulus"
- — "multiplier"
- — "increment", randomly chosen based on seed with truncation of lower-order bits
- — initial seed value based on seed
- — current iteration or reward rotation number, an integer
When players enter a mission, they get a random seed. Depending on that seed, they get a value between 0 and 1 inclusive which we will call "initial seed". After reaching a reward rotation, players get a random reward based on their initial seed.
On the next reward rotation, players will get a new random number depending on the seed. This new random number will be added to the initial seed. In other words, if the initial seed was 0.5, the interval picking number will be equal to 0.5 + increment
. However, this "random" value is the same for every checkpoint after due to truncation in the RNG.[1] For example, the 3rd reward rotation would be determined by 0.5 + increment
+ increment
or 0.5 + (2 * increment
).
The issue with this RNG is that it is more deterministic as one with this knowledge and the loot table drop chances (previously hidden from players until 2021-06-28 or just before Update 21.0 (2017-06-29)[13]) can determine their initial seed and on the 2nd reward rotation determine what increment is (approximately). By extension, one can calculate the approximate number of reward rotations until players get their desired reward. Another issue with this method is that players that rolled a low increment
value may experience getting the same reward multiple reward rotations in a row; this is more prevalent if the player's first reward is a common item though it is possible for a player to receive consecutive rare drops with a very low or very high increment value.[1]
Sample Scenario (pre-Update 8.1 (2013-06-07))
- Tier 3 Defense drop table[14]
- Order matters in determining drops (pre-Hotfix 10.6.2 (2013-11-05) at least).
- Drop chances are rounded to nearest two decimal places.
- This pre-Update 8.1 (2013-06-07) drop table are from a time where there is no such thing as AABCCCC... reward rotations (i.e. three different drop tables labeled A, B, and C). Instead, each reward rotation pulls from the same drop table.
- Each mission type has three difficulty tiers, each with a separate drop table labeled "Tier 1", "Tier 2", and "Tier 3" corresponding to "Easy", "Medium", and "Hard" respectively. Difficulty levels depend on starting enemy level ranges.
Tier 3 Defense | ||
Hellfire | 18.97% | |
Heated Charge | 18.97% | |
Convulsion | 3.16% | |
Deep Freeze | 0.15% | |
North Wind | 0.15% | |
Shocking Touch | 0.15% | |
North Wind | 0.15% | |
Hellfire | 18.97% | |
Stormbringer | 3.16% | |
Cryo Rounds | 0.15% | |
Split Chamber | 0.15% | |
Barrel Diffusion | 0.15% | |
Hell's Chamber | 0.15% | |
Stretch | 0.15% | |
Redirection | 3.16% | |
Streamline | 18.97% | |
Enemy Sense | 3.16% | |
Enemy Sense | 0.15% | |
Rush | 0.15% | |
Focus | 3.16% | |
Banshee Helmet Blueprint | 3.16% | |
Banshee Chassis Blueprint | 0.15% | |
Banshee Systems Blueprint | 3.16% | |
Orokin Tier 3 Extermination Key | 0.15% |
Hellfire | Heated Charge | Hellfire | Streamline | Focus | ||||||||||||||||||||
↑ 0 | ↑ 0.1897 | ↑ 0.3794 | 1 ↑ |
For example, in a pre-Update 8.1 (2013-06-07) scenario where a player starts a Tier 3 Defense mission[14]:
- At Wave 5, they get Heated Charge. Now they know their initial seed was between 0.1897 inclusive and 0.3794 exclusive. The way this is determined is:
- Create an interval between 0 inclusive and 1 exclusive consisting of all the possible rewards (note that the sum of drop chances is 1 or 100%). For example, Hellfire is 0.0 - 0.1897, Heated Charge is 0.1897 - 0.3794, etc.
- Find out where the initial seed fits in and that is the item players will get. In this case, 0.1897 ≤
initial_seed
< 0.3794
- At Wave 10, they get Heated Charge again. Now they know their increment was approximately between 0 inclusive and 0.1897 exclusive or between 0.8104 inclusive and 1 exclusive.
- 0.1897 ≤
initial_seed
+increment
mod 1 < 0.3794- If
initial_seed=0.2111
andincrement=0.1512
, then (0.2111 + 0.1512) mod 1 = 0.3623 - If
initial_seed=0.3345
andincrement=0.8556
, then (0.3345 + 0.8556) mod 1 = 0.1901 - If
initial_seed=0.3793
andincrement=0.9999
, then (0.3793 + 0.9999) mod 1 = 0.3792
- If
- 0.1897 ≤
- In order to get the Orokin Tier 3 Extermination key, the last drop in the table, players would need to get a value between 0.9985 inclusive and 1 exclusive.
- 0.9985 ≤
initial_seed
+ (5 *increment
) mod 1 < 1- If
initial_seed=0.2111
andincrement=0.1512
, then players will need to play at least 574 reward rotations to get their first key drop
0.2111 + (574 * 0.1512) mod 1 = 0.9671 - If
initial_seed=0.3345
andincrement=0.8556
, then players will need to play at least 217 reward rotations to get their first key drop
0.3345 + (217 * 0.8556) mod 1 = 0.9671 - If
initial_seed=0.3793
andincrement=0.9999
, then players will need to play at least 3,794 reward rotations to get their first key drop, with the next 14 reward rotations also providing the key drop (15 consecutive rare rewards!)
0.3793 + (3794 * 0.9999) mod 1 = 0.9999
- If
- 0.9985 ≤
Sample Code
The following Lua snippet provides a sample sequence of one thousand values (i.e. 1,000 reward rotations pre-Update 8.1 (2013-06-07)) based on the above scenario if initial_seed=0.2111
and increment=0.1512
:
local initial_seed = 0.2111
local increment = 0.1512
local previous = initial_seed
-- Rotation #574, #865 will hit the threshold needed for
-- Orokin Tier 3 Extermination key
for i = 1, 1000, 1 do
local result = (previous + increment) % 1
previous = result
if (result >= 0.9985 and result < 1) then
print(i, result, "hit")
else
print(i, result)
end
end
Other Uses of RNG
In WARFRAME, RNG is not just used to determine whether or not an item will drop for players. It is also used in, but not limited to:
- Graphics like special effects (SFX)[1] and bullet decals
- General gameplay
- Weapon mechanics such as Critical Hits, Status Effects, Multishot, Accuracy, and Recoil
- Stat bonus on Kuva Lich or Sisters of Parvos weapons and Railjack Armaments
- Buff & Debuff chance to trigger (such as from Arcane Enhancements)
- Enemy AI and spawning mechanics
- Assassin appearances such as Stalker or Syndicate death squads
- Mining, Fishing, Conservation, and Hacking minigames
- Matchmaking
- The Warframes chosen for the week's Helminth Invigoration
- Mods
- Rewards
- Nightwave offerings
- Daily Tribute rewards
- World State
- Invasions availability and rewards
- The Steel Path incursions
- Syndicate missions
- Arbitrations
- Void Fissures
- Nightwave challenges
- Sortie missions
- Bounty types and reward pools availability
- Nightmare Mode missions
- Daily Darvo Deals
- Sentient Anomaly location in Veil Proxima
- Lich System
- Requiem Mods sequence
- Reward tax on completing a node
- Requiem Murmur gain on mercy kills
- Mission node influence
- Whether or not the Lich spawns with an Ephemera
- Animations
- Parazon kills
- Environment
- Generation of mission Tile Sets that comprise of a map
- Movement of Kuva Fortress across the Star Chart
- Weather system in Landscapes
- Physics
- Ragdolls
- Projectile trajectory
- Sound
- Chosing which dialogue to play from NPCs, enemies, and vendors
- Filters and modulation of in-game transmissions
- Dynamic ambient/combat music
- Weapon sounds
External Links
- https://navarroj.me/WarframeRNG.html - Random Number Generation in Warframe (2016) by Jordan Navarro
- https://www.random.org/randomness/ - Introduction to Randomness and Random Numbers by Dr Mads Haahr
- https://limboh27.medium.com/implementing-weighted-rng-in-unity-ed7186e3ff3b - Implementing Weighted RNG in Unity by Harvey Limbo
- https://blog.bruce-hill.com/a-faster-weighted-random-choice - A Faster Weighted Random Choice by Bruce Hill
- https://www.dev-notes.eu/2020/06/Pseudo-Random-Numbers-in-a-Range-and-Modulo-Bias/ - Pseudo Random Numbers in a Range and Modulo Bias by David Egan
- https://lostgarden.home.blog/2014/12/08/loot-drop-tables/ - Loot Drop Tables by Daniel Cook
- https://www.youtube.com/watch?v=LWFzPP8ZbdU - Noise-Based RNG presented by Squirrel Eiserloh during Game Developers Conference 2017
- https://www.youtube.com/watch?v=qO8FAQvlgX0 - Math for Game Programmers: Parallel Random Number Generation presented by Manny Ko during Game Developers Conference 2015
- https://www.youtube.com/watch?v=dwI5b-wRLic - The Two Types of Random in Game Design by Game Maker's Toolkit
- In other games
- https://forums.gearboxsoftware.com/t/vault-hunting-101-a-guide-to-rng-and-loot/1153869 - Vault Hunting 101: A Guide to RNG and LOOT! by VaultHunter101, RNG in Borderlands series
- https://bulbapedia.bulbagarden.net/wiki/Pseudorandom_number_generation_in_Pok%C3%A9mon - Pseudorandom number generation in Pokémon on Bulbapedia, the community-driven Pokémon encyclopedia
- https://www.youtube.com/watch?v=MiuLeTE2MeQ - RNG by UncommentatedPannen, about how RNG is used in Super Mario 64
- https://sinepost.wordpress.com/category/mathematics/probability/probability-in-game-design/ - Archive for the 'Probability in Game Design' Category by Neil Brown, featuring XCOM series
References
- ↑ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 Rng Algorithm Bugs/changes forum post by [DE]Steve https://forums.warframe.com/topic/128402-rng-algorithm-bugschanges/
- ↑ https://en.wikipedia.org/wiki/Random_number_generation
- ↑ See #External Links for some examples of random number generators in other games
- ↑ "Glen (our Tech Director) identified and fixed a serious distribution flaw with random number generation (RNG) in Warframe. While enemy drops were not seriously affected, a truncation in the random 'seed' within the mission reward script could result in a terrible chain of bad luck. While some players may have benefited from this (a chain of good luck) the distribution was terrible." - Hotfix 10.6.2 (2013-11-05) patch notes
- ↑ Hotfix 29.5.7 (2020-12-10) fixed a short-lived issue on Ayatan Amber Star drop rates: "Fixed Ayatan Amber Stars dropping far less frequently than before Deimos Arcana."
- ↑ 6.0 6.1 6.2 6.3 6.4 6.5 Devove, FineNerds, & VoiD_Glitch. (n.d.). WARFRAME - Rarity Weights and "Random" Number Generation. Retrieved from July 13, 2018 on VoiD_Glitch's Github (since takened down) Archived from the original on December 21, 2018.
- ↑ Math for Game Programmers: Parallel Random Number Generation - 7:25
- ↑ 9.0 9.1 9.2 9.3 9.4 Obtained from the official drop table repository https://www.warframe.com/droptables on 2021-07-06
- ↑ See File:T1IsoVaultRewards.jpg
- ↑ From official drop tables, retrieved 2021-10-31
- ↑ This process can be partially observed in the game engine's log: EE.log
- ↑ https://forums.warframe.com/topic/809777-warframe-drop-rates-data/ - Warframe Drop Rates Data forum post
- ↑ 14.0 14.1 According to u/Pwnatron in https://www.reddit.com/r/Warframe/comments/1fl18h/defense_mission_rewards_and_scaling/, posted on 2013-06-03
Patch History
Hotfix 10.6.2 (2013-11-05)
Improved distribution of random numbers generated by RNG. More information: https://forums.warframe.com/topic/128402-rng-algorithm-bugschanges/
NOV 5th, 2013 - RNG ALGORITHM CHANGES
If you are one of those players that feel like the RNG Gods are angry with you, starting today you may begin to notice a more fair and balanced hand from these divine beings.
Glen (our Tech Director) identified and fixed a serious distribution flaw with random number generation (RNG) in Warframe. While enemy drops were not seriously affected, a truncation in the random 'seed' within the mission reward script could result in a terrible chain of bad luck. While some players may have benefited from this (a chain of good luck) the distribution was terrible.
For context: Games use a lot of random numbers for things other than drops; for example when you blast one of those damned security cameras and a shower of sparks explodes out of it the each particle’s direction is determined by an RNG. Since games need a lot of RNG for effects and other things we actually have a very optimized RNG to make the game run quickly – the problem is you trade entropy (how random it is) for speed.
The RNG for drops needed to be slow and good to be fair and truly reflect the intended drop rates. The new code changes embraces a much slower and entropic means of determining drops of all kinds - weapons, Warframe parts, etc.
I'm very sorry for the frustration this has caused. We are committed to preventing future regression through automated tests... Attached to this post are contrast-boosted images from these tests. The bugged RNG, which is plainly giving dreadful runs. The 'fast' RNG without the truncation error - much better but still with an obvious pattern. Lastly, Glen's new code which shows a vastly improved distribution.
Thank you for reading and happy hunting Tenno!
Left to right: Bugged, Fast, Fixed (new hotness)
These pictures show the output of each RNG technique repeatedly flipping a coin: White is heads, Black is tails. In order for the loot tables to be fair and well distributed you want your RNG to output something that looks like static (which the new approach does).