Is Random Number Generation completely random? Does every item have the same chance to drop? (Non-Exclusive)
Is it possible for UNCOMMON to be less rare than COMMON, RARE to be less rare than UNCOMMON, or LEGENDARY to be less rare than RARE? (Non-Exclusive)
Does attaining a higher Mastery Rank lead to a higher chance to receive rarer items? (Non-Exclusive)
Does the DROP CHANCE of an item depend on how many times I kill an enemy? (DROP TABLES, Exclusive)
Does the level of an enemy influence the DROP CHANCE of items? (DROP TABLES, Exclusive)
Does equipping a certain Warframe impact the chance of an enemy to drop an item? (DROP TABLES, Exclusive)
Do VOID RELICS stack between players? For example, if my group and I bring four RADIANT VOID RELICS to a mission, do we have a 40.00% chance of receiving a RARE item? (MISSION REWARDS TABLES, Exclusive)
WARFRAME makes use of four rarity constants to define the deterministic values its Random Number Generation system relies on. These values are uniform across DROP TABLES and MISSION REWARDS TABLES and are applied to each one in-game.
COMMON = 0.755 UNCOMMON = 0.22 RARE = 0.02 LEGENDARY = 0.005
0.755 + 0.22 + 0.02 + 0.005 = 1
COMMON DROP CHANCE (PER ITEM) = BASE COMMON DROP CHANCE / NUMBER OF ITEMS (ASSIGNED COMMON RARITY) UNCOMMON DROP CHANCE (PER ITEM) = BASE UNCOMMON DROP CHANCE / NUMBER OF ITEMS (ASSIGNED UNCOMMON RARITY) RARE DROP CHANCE (PER ITEM) = BASE RARE DROP CHANCE / NUMBER OF ITEMS (ASSIGNED RARE RARITY) LEGENDARY DROP CHANCE (PER ITEM) = BASE LEGENDARY DROP CHANCE / NUMBER OF ITEMS (ASSIGNED LEGENDARY RARITY)
DATA SELECTION: 8 COMMON, 6 UNCOMMON, 4 RARE, 2 LEGENDARY
COMMON: 0.755 / 8 = 0.094375 = 9.4375 = 9.44% UNCOMMON: 0.22 / 6 = 0.0366666666666667 = 3.66666666667 = 3.67% RARE: 0.02 / 4 = 0.005 = 0.5 = 0.50% LEGENDARY: 0.005 / 2 = 0.0025 = 0.25 = 0.25% COMMON: 9.4375 * 8 = 75.5 UNCOMMON: 3.66666666667 * 6 = 22 RARE: 0.5 * 4 = 2 LEGENDARY: 0.25 * 2 = 0.5
Normalization is initiated when one or more of the existing rarity constants are not present in a DROP TABLE or MISSION REWARDS TABLE. To normalize is to “multiply (a series, function, or item of data) by a factor that makes the norm or some associated quantity such as an integral equal to a desired value (usually 1)”. However, to perform normalization in this case, we would not multiply. Rather, we would divide by the available listings in order to return scaled up versions of the values that are present.
DATA SELECTION: 1 COMMON, 1 UNCOMMON, 1 RARE, 0 LEGENDARY
COMMON: 0.755 / (0.755 + 0.22 + 0.02) = 0.7587939698492462 = 75.87939698492462 = 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.0201005025125628 = 2.010050251256281 = 2.01%
75.87939698492462 + 22.1105527638191 + 2.010050251256281 = 100
Attenuation is an active variable exclusive to the DROP TABLE Random Number Generation system. Attenuation can be defined as “a general term that refers to any reduction in the strength of a signal.” This should mean that the higher the Attenuation value is, the lower the drop chance of an item is. As far as we know though, Attenuation has no impact on the drop chance of any item or the impact of it is not strong enough to be accurately tested.
Bias is an active variable exclusive to the DROP TABLE Random Number Generation system. Bias can be defined as “prejudice in favor of or against one thing, person, or group compared with another, usually in a way considered to be unfair”. This means that bias can have a positive or negative impact on an entity. In WARFRAME, bias is a variable that negatively impacts the DROP CHANCE of an item. Essentially, the more bias an item has, the lower its DROP CHANCE is. Bias still scales from the actual rarity it is assigned though, so items with rarities that hold more weight then another will still tend to drop more often, depending on the amount of bias that is present. To see the data that I am referencing to generate my opinion, please visit this link: https://docs.google.com/spreadsheets/d/1wI4c7KJdOKYy6QEZl2h84MFxYHB2Jjx0ibuO3fTtSms/edit?usp=sharing.
rewardSeed is an active variable exclusive to the MISSION REWARDS TABLE Random Number Generation system. It is a 64-bit integer that determines the missionReward players receive at the end of a mission. It is granted to you at the start of the mission, and remains with you until completion of it. rewardSeed(s) are given to the host, and members of the host’s group receive the sessionId in order to participate in the same session. You only receive a rewardSeed when your client needs to distribute it to players in your group or if it is possible to distribute to players in your theoretical group (as 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 granted a rewardSeed. Although the SRand variable, the seeding for the random number generator (a pseudo-random integer between 0 and RAND_MAX), is different for each player, each player will always receive the same missionReward, as long as they are in the same session as the host.
To truly understand what Random Number Generation means in terms of how distributed it is, we developed a Weighted RNG Image Generator that mimics WARFRAME’s Random Number Generation system, using no seed as a randomization modifier.
First, let’s view the image that Digital Extremes published on November 5, 2013: http://warframerng.cu.cc/WarframeRNG2013.png. In this image, you can see how there are two values represented by the colors Black and White. They even explain it in https://forums.warframe.com/topic/128402-rng-algorithm-bugschanges/ when they state, “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).” Just for verification, we used http://www.cssdrive.com/imagepalette/index.php to conclude that there are indeed only two colors being measured in this image. “#ffffff” and “#000000” were returned. Using http://www.coolphptools.com/color_extract#demo and setting the amount of colors to “2” (Black and White), the delta to “255”, and reducing the gradient, we found out that the Black (#000000) is proportionate to 52.9822 or 52.98% of the image while White (#ffffff) is proportionate to 47.0178 or 47.02% of the image. Considering this information, I would not call their static approach equal, but I would say it is relatively fair. The reason that it is not a 50.00:50.00 ratio could also be due to the fact that an unknown randomization modifier was in play that slightly modified the randomness of the values. However, using the data discussed above, we wrote a Weighted RNG Image Generator and set the values to represent the COMMON, UNCOMMON, RARE, and LEGENDARY rarity constants from WARFRAME’s actual Random Number Generation system.
Let’s view the image we generated using our above knowledge of the WARFRAME Random Number Generation system: http://warframerng.cu.cc/VoiDGlitchRNG2016.png. In this image, you can see how there are four values represented by the colors Black, Olive, Dark Turquoise, and Magenta. Using http://www.cssdrive.com/imagepalette/index.php without a seed in place only reveals to us two main colors. This may be because there is not enough immediate randomization without a seed to preview other colors. However, if we put a seed in place, all four of the colors are revealed. Using our own internal systems, we calculated the distribution of the colors. Black: 0.77970790863 or 77.97%, Olive: 0.19932174682 or 19.93% , Dark Turquoise: 0.01502609252 or 1.50% , and Magenta: 0.00594425201 or 0.59%. Obviously, this is very different compared to the data we recovered from Digital Extremes’ image.
My only conclusion to this is that either Digital Extremes inexplicitly modified their Random Number Generation over the course of three years (most likely), they maliciously lied to their playerbase regarding how their Random Number Generation system operated (less likely), or they simply did not even understand their own system Random Number Generation system to begin with (least likely).
commonValue.png - [PNG IMAGE] Float value that represents "COMMON". legendaryValue.png - [PNG IMAGE] Float value that represents "LEGENDARY". matchRecord.h - [H FILE] List of enumerators inside of the "mr" data set. matchSession.h - [H FILE] List of enumerators inside of the "ms" data set. mRarity.png - [PNG IMAGE] Enumerators that define the WARFRAME Random Number Generation system. rareValue.png - [PNG IMAGE] Float value that represents "RARE". Seed_Randomization_Generator.c - [C FILE] Generates text simulations of an integer seeded by an SRand variable based on time. sessionRecord.h - [H FILE] List of enumerators inside of the "sr" data set. uncommonValue.png - [PNG IMAGE] Float value that represents "UNCOMMON". Weighted_RNG_Generator.php - [PHP FILE] Generates text simulations of Weighted Random Number Generation, based on (200) executions. Initial values are set to simulate the WARFRAME Random Number Generation system. Weighted_RNG_Image_Generator.cs - [CS FILE] Generates image simulations of Weighted Random Number Generation, based on (Width * Height) executions and a seed (set this to true if you want, but it initiates at false). Initial values are set to simulate the WARFRAME Random Number Generation system.