Is 325-350 pulls still the magic target?

2»

Comments

  • Vhailorx
    Vhailorx Posts: 6,085 Chairperson of the Boards
    Thanks Helix, this is great!
    Can you clarify your assumption #5, please?  Are you resetting the shargeted character after each pull?  that seems quite inefficient.  Wouldn't the better strategy (given your assumptions that all 3 are starting out even) be to sharget the oldest character to minimize the downside?
    Can you add some info for the lower-likelihood set?  For example: if you only have 200 pulls, how likely are you to champ 1, 2, or 3 of the 5*s?
    Finally, can you give any information about the cover distributions for non-3xchamp outcomes.  So if you made 260 pulls, but didn't get 3 champs (~50% probability) should you expect 9+/-2 covers, or 8+/-3?
  • KGB
    KGB Posts: 3,189 Chairperson of the Boards
    edited November 2020
    I was trying to verify your results with a simple C++ program you can run/test in the browser and I'm not getting close to your results. When you are counting successes, are you adding in any extra shard covers beyond the 2 starting ones (so you could potentially make a success with 3 sharded covers plus 10 others) or considering the possibility of converting 3 extra covers into a needed one?
    Here's my simple program. I assume only 11 covers are needed for success since you start with 2 shard covers. I do not factor in sharding covers from the draws/converting covers which is why I asked if your doing that when calculating success.
    #include <iostream>

    using namespace std;

    int main()
    {
        int numTokensToOpen = 260;
        int covers[9];
        int luck[3];
        int success = 0;

        luck[0] = 0;
        luck[1] = 0;
        luck[2] = 0;
        for (int j=0; j<9; j++)
        {
            covers[j] = 0;
        }
            
        srand(time(0));  // Initialize random number generator.
        
        // 1000 Simulations
        for (int i=0; i<1000; i++)
        {
            // Open X tokens
            for (int j=0; j<numTokensToOpen; j++)
            {
                // 15% chance to draw 5* cover
                if ((rand() % 100 + 1) <= 15)
                {
                    covers[rand() % 9]++;  // Draw a random cover for 1 of the 3 latest
                }
            }
            
            // Check to see how 'lucky' we were. Expect to get 15% draw rate so anything
            // more than 2% out is lucky/unlucky.
            int totalCovers = covers[0]+covers[1]+covers[2]+covers[3]+covers[4]+
                              covers[5]+covers[6]+covers[7]+covers[8];
            if (totalCovers < numTokensToOpen*0.13)
            {
                luck[0]++; // Very unlucky
            }
            else if (totalCovers > numTokensToOpen*0.17)
            {
                luck[2]++; // Very Lucky        
            }
            else
            {
                luck[1]++; // Average luck
            }
                 
            // We can remove excess covers beyond 5 because that doesn't change whether
            // we fully covered a character or not and it simplifies checking for success.
            for (int j=0; j<9; j++)
            {
                covers[j] = min(covers[j], 5);
            }
            
            // Check for fully covered. All we need is 11+ covers total since the assumption
            // is that there will be 2 covers available from shards.
            if ((covers[0]+covers[1]+covers[2]) >=11 &&
                (covers[3]+covers[4]+covers[5]) >=11 &&
                (covers[6]+covers[7]+covers[8]) >=11)
            {
                success++;
            }
            
            for (int j=0; j<9; j++)
            {
                covers[j] = 0;
            }
        }
        cout << "Luck factor: Unlucky " << luck[0] << " Average " << luck[1] << " Lucky " << luck[2] << endl;
        cout << "Total successes " << success << endl;
        cout<<"Opening " << numTokensToOpen << " covers has " << (float)success/10.0 << " chance to fully cover all 3 characters" << endl;

        return 0;
    }
    You can test it here by replacing what's in the main with my main and then hitting 'run' in the top menu and varying the number of tokens to open
    I'm getting the following numbers (I also verified in Visual Studio C++ that the random is roughly the same):
    260 Draws:
    Luck factor: Unlucky 167 Average 687 Lucky 146                                                                                                    
    Total successes 295                                                                                                                                                   Opening 260 covers has 29.5 chance to fully cover all 3 characters                                                                         

    280 Draws:

    Luck factor: Unlucky 162 Average 646 Lucky 192                                                                                                     Total successes 438                                                                                                                                                    Opening 280 covers has 43.8 chance to fully cover all 3 characters
    300 Draws:
    Luck factor: Unlucky 142 Average 708 Lucky 150                                                                                              Total successes 560                                                                                                                                                    Opening 300 covers has 56 chance to fully cover all 3 characters
    320 Draws:
    Luck factor: Unlucky 132 Average 724 Lucky 144                                                
    Total successes 689                                                                                                                                               
    Opening 320 covers has 68.9 chance to fully cover all 3 characters
    KGB
  • helix72
    helix72 Posts: 995 Critical Contributor
    Hey @Vhailorx ! Lots of great questions in there, so forgive the lengthy response but I want to be complete so here goes:

    Shard Targeting:
    There are a couple different ways we could do shard targeting. I wanted to start by doing the method that results in giving the highest chance of champing all 3 the fastest. But an astute reader will note that's not actually what I did, because I start by comparing total effective covers, and for example, getting a 5/0/0 with 0 shards to champ status would take more pulls on average than getting a 0/0/0 with 2000 shards to champ status even though the latter actually has fewer effective covers (4 vs 5).

    What I did do was a bit of a compromise but basically looks at 3 things before each pull, which I'll use an example to illustrate:

    Pull X:
    Toon 1: 3 covers 500 shards
    Toon 2: 4 covers
    Toon 3: 2 covers 1070 shards

    1) What is the total number of effective covers on each toon including shards I could convert to covers? In the above example, each has 4 effective covers. So we'd go to the next tie breaker.
    2) Which toons have the fewest "leftover" shards? In the above, after converting shards to covers, toon 1 and toon 2 both have 0 shards while toon 3 has 70, so 1 & 2 are still tied but 3 is out. To the next tiebreaker:
    3) Randomly pick between 1 and 2

    While you're checking after every pull, you're not actually switching the target after every pull unless the answer changes. Now, I agree that in practice you might not want to stop after every pull and check and see if it's time to switch your shard target. But if you don't, you're actually disadvantaging yourself a bit and increasing the number of pulls you'll need, though how material that would be would depend on what method you switched to and then we'd have to model it.

    As for alternative shard targeting strategies, we absolutely can model different ways, and in fact with a little work we can develop a rolling simulation that says something like "I'm always going to shard the oldest character". But a risk there, as an example, is if the oldest character is already at 12 covers, the middle character is at 2, and the newest at 7, if you're still shard targeting the oldest, you're likely to run into a problem trying to get the middle guy (or gal champed). But again, we can model it any way, let me know what you'd like to try and I can model it out.

    Lower-likelihood Sets
    Absolutely can give you lots of different info on this. To answer your specific question, using the same assumptions as before, if you have 200 pulls:

    85% chance you champ 1
    45% chance you champ 2
    10% chance you champ 3

    Feel free to throw out any other scenarios.

    Leftovers
    Absolutely can give you expectations on the "leftovers" in situations where you didn't get 3 champs. Initially I was not capturing this part of the output so I'll need to set up that data capture and run the sims again, will take a bit more work but it can be done.
  • helix72
    helix72 Posts: 995 Critical Contributor
    KGB said:
    When you are counting successes, are you adding in any extra shard covers beyond the 2 starting ones (so you could potentially make a success with 3 sharded covers plus 10 others) or considering the possibility of converting 3 extra covers into a needed one?
    I'm doing it in Excel (I know there are some who think that the Excel random number generator may not truly be random but I would argue it's random enough). Yes on allowing for extra shards, no on cover conversion. As an example, here are a couple simulated outcomes:

    Run 1: 208 pulls to champ all 3
    Toon 1: 4/5/4 w 1024 shards
    Toon 2: 2/7/3 w 1501 shards
    Toon 3: 3/4/4 w 1099 shards

    Run 2: 288 pulls to champ all 3
    Toon 1: 7/4/6 w 1012 shards
    Toon 2: 6/3/6 w 1003 shards
    Toon 3: 4/5/1 w 1852 shards

    Run 2: 301 pulls to champ all 3
    Toon 1: 2/4/4 w 1579 shards
    Toon 2: 4/5/2 w 1153 shards
    Toon 3: 9/5/2 w 1174 shards
    KGB said:
    I'm not getting close to your results. 
    That's because...I messed up! I had been doing some scenario testing and accidentally not reset my starting covers to 0/0/0. My apologies! Thanks for pointing that out and here are the revised outcomes based on all the assumptions stated prior:

    %ile # pulls
    Mean 283
    Median 280
    66.7% 302
    75.0% 318
    80.0% 326
    85.0% 335
    90.0% 347
    95.0% 364
    97.5% 405
    @Vhailorx this means my previous answers to your 2nd and 3rd parts were also incorrect, gotta get back to real work but will look to re-run them later.

    @KGB thanks for the peer review! Let me know if these now make more sense, when you factor in my allowance for shards.
  • KGB
    KGB Posts: 3,189 Chairperson of the Boards
    Yup, those numbers make a lot more sense now. Your percentages are 7-10% higher than mine at 280/300 but that refllects the fact you are getting a 3rd sharget cover around that point so you have a higher chance to complete the character.
    So overall you still need roughly 320 pulls to get 80% chance to complete all 3 given you start with 2 covers worth of shards. It's no where near as good as I'd hoped it would be given you should have roughly 16 covers from the pulls and 18-19 overall (including shard covers).
    KGB

  • LavaManLee
    LavaManLee Posts: 1,413 Chairperson of the Boards
    As an interesting real life data point to this: Today, it took me 153 pulls to get a 3/1/1 OMD to 5/5/2.  Along the way I also got 3 Heimdall and 3 D5.  Definitely not the smooth 1/7 chance that one might expect but I am not upset.  Definitely wanted to champ OMD so glad I could do so before he left LL.  
  • scottee
    scottee Posts: 1,610 Chairperson of the Boards
    I don't have the brain power to do maths right now, but I have a couple things I've learned from my hoarding experience to cover all 3 in LL.

    - You actually only need about 10% less than what you decide is your target number, because you'll get a another LL about every 10th 4* cover from champ rewards. (Assuming you have all 4* champs) I know there's less because of the 5* pulls, but there's also extra CP along the way.

    - I usually set my 5* shards to target whichever of the latest 3 will leave LT soonest. If you don't make it to maxed 13 for the latter 2, you can also keep pulling for several more weeks until you have them.

    - I play more casually than I used to, but because of shards in CL10, I've been able to constantly pull LT and champ most of the recent 5*. (I only got 12 covers on Yelena when she left, but am almost done with her. I hoarded for Storm/Ice/ProfX, skipped Carnage, then opened constantly starting at BRB. Yelena was the only why I was trying to get but didn't.)