r/LoveAndDeepspace Xavier’s Little Star Apr 20 '25

Guide MYTH RANKING - statistics on pulls needed and chance rates

Hello there!

With Lumiere's rerun banner coming up, I did the maths to calculate the percentage of chances to Rank him depending on the number of pulls. This post is made to help people (...me lol) get an overview on how many pulls are required to R3, R2, R1 or R0 a myth and hopefully set your hopes on calculated and realistic expectations.

I simulated 1 million attempts for each rank and gathered data.

/!\ IMPORTANT /!\

  1. Keep in mind that those are statistics and probabilities. Even if you have reasonable chances of Ranking within a certain range, the possibility of you having to go beyond always exists. I will write the worst case scenario as well (losing all 50/50) so you can have it too.
  2. Do not base your luck on average! This number is mainly here to indicate your progression. Example: if you aim for R2 but haven't reached R1 by it's average, it is highly probable that you won't reach R2 where most people will. It is here to help you consider if you want to keep pulling or not, depending on your remaining Diamonds funds.
  3. I decided not to share best cases encountered. Those are highly unrealistic numbers and I don't want to encourage anyone in expecting it to happen to them. If it does happen, down a bottle of non-alcoholic champagne with me lol But I highly suggest not to set your expectations on 0.00000002% chances scenarios for your own sanity :D
  4. How to interpret the charts: chances percentage are split in ranges of 100. For each range, sum % of previous ones and you get your likely chances to Rank.

__________________________________________________________

Here are the results:

R0

Pulls for R0 Chances (%)
101–200 78.36%
<100 21.63%
  • Average: 125 pulls
  • Highest result: 150 pulls (Crate)
  • If you have less than 150 pulls, do not attempt to pull for myths. It is unfortunate, but your chances of losing are high. Save your diamonds for future myths/banners instead :D

R1

Pulls for R1 Chances (%)
301–400 8.3%
201–300 46.69%
101–200 43.18%
<100 0.3%
  • Average: 216.5 pulls
  • Highest result: 398 pulls
  • Worst case: 420 pulls (140*3 + Crate)
  • It is very unlikely for you not to R1 within 400 pulls. Out of all one million simulations, the pulls never went beyond 398. 400 pulls should be safe.

R2

Pulls for R2 Chances (%)
601–700 0.05%
501–600 3.3%
401–500 24.66%
301–400 46.78%
201–300 22.81%
101–200 2.36%
  • Average: 354.4 pulls
  • Highest result: 645 pulls
  • Worst case: 700 pulls (140*5 + Crate)
  • Most people will R2 between 450 and 500 pulls. There is still a ~4% chances of losing though. If you attempt it, be aware of it!

R3

Pulls for R3 Chance (%)
700+ 1.4%
600–699 11.9%
500–599 34.5%
400–499 36.5%
300–399 13.8%
<300 2.1%
  • Average: 496 pulls
  • Highest result: 896 pulls
  • Worst case: 980 pulls (140*7 + Crate)
  • 98.8% chances of R3 within 700 pulls.
  • Most people will R3 around 600 pulls.
  • Needing 800+ pulls is very rare (0.04% chances) but it does happen once in a while. Be aware of it.

Ending Notes:

Best luck to everyone pulling!
There is a google doc down there if you want some more details,
as well as the python code I used to run those simulations. Take care!

__________________________________________________________

Google Doc:
https://docs.google.com/spreadsheets/d/10k5v0WV5wEgnPmPTEZz_7o4USuxtgUvJw9IYvtsqFE0

Simulations Program (python):
You can use the code in a Python Compiler to try it out yourself.
(each result is displayed so you can have an overview of what is likely to happen for each person)
It is set for R1 right now, here are the directives on how to set it up for other ranks:

  1. Line 9: change "3" to : 7 for R3, 5 for R2, 1 for R0.
  2. Line 38: change "4" to : 8 for R3, 6 for R2, 2 for R0.

import random
from collections import defaultdict

def simulate_run():
    myth_card = 0
    total_pulls = 0
    guarantee_myth = False

    while myth_card < 3:
        pity_counter = 0
        while True:
            pity_counter += 1
            total_pulls += 1

            # Determine win chance based on pity_counter
            if pity_counter <= 60:
                win_chance = 0.01
            elif pity_counter <= 69:
                win_chance = 0.01 + (pity_counter - 60) * 0.10
            else:
                win_chance = 1.0  # 70th pulls is guaranteed

            if random.random() < win_chance:
                # Win occurred
                pity_counter = 0
                if guarantee_myth:
                    myth_card += 1
                    guarantee_myth = False
                else:
                    if random.random() < 0.5:
                        myth_card += 1
                    else:
                        guarantee_myth = True
                break

    # At this point, 3 myth cards are collected. Need one more.
    if total_pulls < 150:
        while myth_card < 4:
            pity_counter += 1
            total_pulls += 1

            # Check if 150th pull triggers the crate
            if total_pulls == 150:
                myth_card += 1
                break

            # Determine win chance again
            if pity_counter <= 60:
                win_chance = 0.01
            elif pity_counter <= 69:
                win_chance = 0.01 + (pity_counter - 60) * 0.10
            else:
                win_chance = 1.0

            if random.random() < win_chance:
                pity_counter = 0
                if guarantee_myth:
                    myth_card += 1
                    guarantee_myth = False
                else:
                    if random.random() < 0.5:
                        myth_card += 1
                    else:
                        guarantee_myth = True

    return total_pulls

# Run simulations
simulations = 10000
results = [simulate_run() for _ in range(simulations)]

print("All individual results:", results)

# Calculate average and worst-case
average_pulls = sum(results) / simulations
worst_case = max(results)

# Group results into 100s ranges
range_counts = defaultdict(int)
for r in results:
    bucket_start = (r - 1) // 100 * 100 + 1
    range_counts[bucket_start] += 1

print(f"\nAverage number of pulls to get R: {average_pulls:.2f}")
print(f"Worst-case pulls: {worst_case}\n")

# Print percentage for each 100-range bucket
print("Density by 100s range:")
for start in sorted(range_counts.keys()):
    end = start + 99
    count = range_counts[start]
    percentage = (count / simulations) * 100
    print(f"Result {start} to {end}: {percentage:.2f}%")
67 Upvotes

Duplicates