It’s a programming concept called “Random Repeatability”. It’s a way to get a sequence of random numbers, but to also get the same random number sequence in the future if needed. It’s used mainly in debugging, testing, and simulations. In this case, it was put in to stop people from “gaming the system” in the very way you accidentally discovered. There was a point where players found out if they opened a token and didn’t get what they wanted, they could kill it and retry.
The simple explanation of the process is this:
Let’s say you want a way to get a random number between 1 and 10. The game enters a number (called the “seed”) into that function and the function uses that seed to determine the outcome (in this case, a number from 1 to 10). These functions have to follow a few rules:
- They have to be deterministic. For any seed, there is only 1 outcome. I can’t get a different number for the same seed.
- Every possible outcome must be possible. For our example, If the function I use can never return the number 7, then it fails the criteria.
- Every possible outcome has to be equally present along the possible span of valid seeds. That means if our function accepts 1000 different seeds, 100 of those seeds should output “1”, 100 should output “2”, 100 of them should output “3” and so on
Now, this is all just to set up the function to generate random numbers. We haven’t touched on how to make them repeatable yet. To accomplish that, we need to add a few more rules to the above:
- To form the sequence, the output of any given seed becomes the seed for the next number.
- The function cannot output sequences that form closed loops of members that are less than the total possible out comes.
Now, #5 is a tough one to explain. Lets say that our function is output = remainder((seed + 13) / 10). In English: take the seed, add 13 to it, divide by 10 and the remainder is our number (for this case, if the remainder is 0, we’ll call it 10). That means if we input:
1 we get 1 + 13 = 14 / 10 = 4
4 → 4 + 13 = 17 /10 = 7
7 → 10
10 → 3
3 → 6
6 → 9
9 → 2
3 → 5
5 → 8
8 → 1
so we get a repeating chain of 1,4,7,10,3,6,9,3,5,8,1,4,7,10,3,6,9,3,5,8,1,4,7,10,3,6,9,3,5,8,1,…
So no matter what seed we choose, we can always figure out what the next number will be and we will always get an even distribution in the long run. (this is the important concept here)
If I had instead chosen this function: output = remainder((seed + 5) / 10) This would happen:
1 → 1 + 5 = 6 / 10 = 6
6 → 6 + 5 = 11 / 10 = 1
We get a closed loop of 2 numbers that would repeat. The other 8 numbers would never appear. In order to prevent this, the “Seed offset” (the number added to the seed) and the modulo (the number we divide by afterwards to get the remainder) cannot have any factors in common. In the good example: 10 and 13 have no factors in common. So it works. In the bad example: 10 and 5 both have a factor in common (5). So it fails.
Now, the good function I chose here is VERY simplistic. It’s probably pretty easy to tell that it just “counts by 3”. That’s because I kept the numbers small so the concept was clearer. Real random number generators use numbers in the billions to quintillion ranges. The number they return is then “normalized” to the output range. So if we were using numbers up to a billion, we might say: randomNumber = roundUp(output / 100,000,000). So that any value returned between 0 and 99,999,999 will be “1”. 100,000,000 to 199,999,999 would be “2”. and so forth. This allows for the “random number sequence” we referenced earlier to have repeat numbers and local areas where some numbers are more/less frequent than others and still be overall consistent in the long run.
In reality when programming, RNGs (random number generators) output decimals in the range of 0 >= output > 1, which is the same as my last example above, but just divide the output by 1 billion and the randomNumber becomes roundUp(output * 10)
tl;dr (summary)
So, the answer to your question, when you drew from the LL shop, that returned your cover and kept the output number of that card in the background. No matter what happens, the next time you draw from that store, you will get the output of that number in the RNG. The only way you will get a different cover is if the shop changes, in which case, you will get whatever cover is assigned to that number now. Either way, the number isn’t going to change.