Introduction.
ESO is not the only game where players loathe the way that RNG drop rates work.
This is a link to what WOW did to fix their problems, but the problems could have been fixed in other ways.
[outlined at end]
http://math.arizona.edu/~ercolani/pyzdek.pdf
The following table lists the parameters of LCGs in common use, including built-in rand() functions in runtime libraries of various compilers.
https://en.wikipedia.org/wiki/Linear_congruential_generator#LCGs_in_common_use
RNG Analysis..
Uniform distribution
Normal distribution
Bernoulli distribution
Binomial distribution
Poisson distribution
Patterned Distribution
Discrete distribution
For the purposes of this thread and the equal chance drop rate of all items, we are limiting this discussion to uniform distribution with seed key, rather than normal distribution with standard deviation.
http://excel.officetuts.net/en/examples/random-number-generatorUnderstanding P-RNG, or dumbing down linear congruential generators for the masses to understand.http://wiki.osdev.org/Random_Number_Generator
Ever wondered why you get duplicate dropped sets ?
Ever wondered why the specific item of gear never drops ?
All is about to be revealed.
Lets start by having a pack of 52 playing cards with a joker to explain LCG in a really simple form.
The 53rd joker is essential as explained later but bare with me for now.
We start with all 53 cards sorted into order, your preferred order is arbitrary, what matters is the deck has been sorted.
Lay the cards down in order from top to bottom to create a column of 53 cards.
Now create 53 labels numbered from 1-53.
Place these 53 labels in order to the left of each playing card.
What we have created here is a 1 dimensional array containing 53 playing cards.
The numbers to the left of the playing cards are the array index for each item (a unique playing card in this case)
Now get a 2nd set of matching playing cards.
Starting with 1x7 as the index, identify cards whose index are multiples of 7, and create a new column.
If the multiples exceed 53, then rollover from 53 to 1 and then 2 etc.
Thus we get new deck card order...
7, 14, 21, 28, 35, 42, 49,
3, 10, 17, 24, 31, 38, 45, 52,
6, 13, 20, 27, 34, 41, 48,
2, 9, 16, 23, 30, 37, 44, 51,
5, 12, 19, 26, 33, 40, 47,
1, 8, 15, 22, 29, 36, 43, 50,
4, 11, 18, 25, 32, 39, 46, 53
...thus we have generated an alternative linear pattern.
All 53 cards are still present, we have just rearranged them into a different sequence.
Note that there are 7 linear ramps using a multiplier of 7 just as there would be 1 linear ramp using a multiplier of 1.
Lastly, we will add 0 to the index and not shift the card sequence at all (keep things simple).
We can create an algorithm to represent this process with a simple mathematical formula.
Pool size = 53 (Modulo)
Pattern ID = 7 out of a possible 52 or pool size -1 (Multiplier)
Pattern Offset = 0 (Increment)
Pattern index = 1-53 (Seed)
(Pattern-Index * Pattern-ID + Pattern-Offset) mod 53 = Random-Index
We can also establish some rules for this algorithm.
1. The pool size must be odd otherwise even number pattern IDs do not create a valid full sequence of numbers.
2. Pool size and seed range encompass all available numbers and automatically generate 'uniform distribution'
3. The use of LCG enables the generation of a virtual array that requires no extra storage
4. The seed acts as an index into a one dimensional array given a fixed modulo, multiplier and increment.
5. There are Pool-size -1 Pattern-IDs that can be generated provided the pool size is kept odd.
6. Low Pattern-IDs have an ascending linear ramp pattern
7. High Pattern-IDs have a descending linear ramp pattern
8. Middle Pattern-IDs have a sawtooth pattern whose number of teeth equate to half the pool size.
I have attached a pdf document here, so that you can see how LCG as a P-RNG source is used to randomise the order of an array.
This document also shows how LCG Patterns can be interleaved to generate Random Noise.
https://cp.sync.com/dl/3c6709ee0#u5yix99e-nhe9fwgn-qkxa6fka-ux3stvm6So how does this relate to ESO ?
1. If the LCG algorithm was called without incrementing the seed value, the RNG would return exactly the same number (ie same set gear piece).
So the LCG increments the seed value every time its called by default (ie changes the array index which may or may not exit the current items range).
2. That means every time a player accesses the LCG algorithm without the seed continuing in an "unbroken" sequence, does not get 'uniform distribution'
without recording/resetting the current seed key value for every player (array index), there is no way to ensure the player gets access to all available items.
3. The available item pool size is much smaller than the modulo used for the LCG algorithm, so each item represents a range of available random numbers.
This means with 100 items, modulo 1000 and a randomised complete sequence of 1000 numbers, the player needs 10 duplicate items and 1000 tries to complete the sequence.
The number of duplicates for any item at any time, is dependant on the pattern-id and discrepancy between the game item pool and the algorithm modulo pool size.
Not withstanding the issues that other players may have already removed the unique options leaving only duplicates for the player anyway.
NB Many algorithm use 2^32 as the modulo....so get pumping out those VMA runs
Conclusion.
I have to assume that the requirement for true "uniform distribution" necessitates the use of the LCG algorithm to guarantee that all available numbers appear once per cycle.
[Indeed, judging by the equal distribution server side but not client side...this appears to be conclusive]
I have to assume that a generic Rand() function thats based on LCG is behind the problems with ESO RNG.
These problems can be fixed by the storage and injection of per player seed keys and much greater control over the variables used to define the LCG algorithm.
eg. using a 256 modulo for a 256 size pool (or 2x128 pattern interleave).
The problem here is using even numbers for the modulo, instantly halves the available Pattern-IDs (ie the even numbered pattern-IDs break).
But using base 2 for the pool size or modulo is what gives LCG its speed with modulo arithmetic.
I would also suggest the use of interleaved Pattern-ID that use the same modulo, as this greatly disrupts the inherent linear nature of the patterns.
There is also no reason why Pattern-IDs (interleaved or not) cant be change regularly.
In a nut shell...Please create a new LCG algorithm and track seed keys.