@vaughnbros Mine's awful and written in Swift, but it plays the game N times and calculates what turn you were able to swing for lethal, how many times you had to mulligan (including Bazaar), and by what turn you could dredge your deck to 0. Seems like we could do some interesting comparisons
@Lesbimagical The issue with mine right now is that I have to query the results for different things after its done. The AI itself just tells me what cards are in my hand, graveyard, ect. from each iteration. The only result I directly put in the loop was "how many turns until I draw a Bazaar on a mull to oblivion."
Ahhhhhh got it. I've been embedding counters/checks in the loops and that's been going well so far. Here's sample output for one game: docs link.
@rikter, mine does Serum Powder.
Here's the output of 10,000 games:
"We played 10000 games and drew Bazaar, on average, with 5.8852 cards in hand. We didn't draw Bazaar in 5.550% games (555 times). We were able to dredge our entire deck on the average turn of 4.5474"
I haven't looked at this in ages haha, it was fun to dig up again. I've got all of the Ichorid and Bloodghast logic in there, I think it should be relatively straightforward to get it to count up power (thought it did that already but there doesn't seem to be any output there).
@rikter Yes, this is a big reason to run it as a simulation. I know there were people calculating it directly (using binomial coefficients or hypergeometric), but you can't actually get a variance, or anything other than a point estimate if you do it that way. The form for hypergeometric variance is extremely complicated.
@ Lesbimagical Yours looks much more advanced than mine is at this point. I suppose I could add these things, but wasn't sure of the value of saying what is occurring after the beginning of turn 2. I think I'm actually going to focus on the what if things go wrong, like if you don't get Bazaar, you get wastelanded, ect.
@Lesbimagical Im curious if its exact powder logic, like is it accounting for the times you have multiple powders in your hand?
@vaughnbros Im curious about your methods, I got somewhat into doing it as a hypergeometric, but like you said, it is ridiculously complicated and involved. Im just amateur stats, but a hypergeometric is basically an exhaustive list of the possible outcomes for every branch on the tree, correct? Want to make sure Im using the correct term! Its so involved, but I don't understand how you could run a proper simulation without doing that, so I'm really curious to find out, because I am pretty sure you are a professional.
@rikter Lesbimagical and I are running simulations, which if run enough times become the same as the exact computation thanks to the Central Limit Theorem (CLT).
Simulations are commonly used machine learning and statistical techniques for problem solving. The combinatorics (hypergeometric and binomial) is a mathematics/probability concept where they are getting the exact value. The reason the latter is not used in a number of situations is because of the complexity of many problems, it is much easier to solve by leaning on the CLT.
@vaughnbros I was about to post that my best guess as to what you were doing was just a simple If no bazaar, mull. If powder and no bazaar, powder, continue until either bazaar or 1 non serum powder. Do it 10 million times and you catch it all. Is this correct? My instinct is always to do direct calcs, but this is a situation where that is cumbersome.
Just curious, what is your number on p (bazaar)? I come up with .875, but thats a simplified number that doesnt consider powder. It also includes the chance that its your top card.
My powder logic is exact; since it simulates the actual deck, if I draw a hand with 4 powders, it removes all of them for the redraw. p(Bazaar) w/Powder, not considering top card or scry, is 94.7% in my runs.
@vaughnbros yessssss, playing against hate is an excellent thing to add. I'm trying to focus right now on the validity of leaving out Dread Return + answering the FKZ v Dragonlord question.
@rikter Its not a decision tree. Its just a simulation that says:
- If Bazaar stop else
- If Powder then exile hand draw that many else
- Repeat from 1 until 1 card left in hand.
- Scry/Draw top cards until you find Bazaar or hit 8 cards in hand for slow dredge.
From there then you can add logic like:
- Draw 2, discard 3.
- Dredge 2 different cards.
- Dredge 1 card.
- Repeat from 2.
To finish dredging your deck.
You run these loops 10 million times, or something like that for the Central Limit theorem to kick in and give you an accurate estimate. (each loop is the equivalent of 1 hand in real life so the efficiency compared to self experience is insane.)
You can also query your hands for the probability of having blue card + force, leylines, and other important starting hand cards.
@Lesbimagical Yeah I can see that. Im guessing this is because you want to calculate avg turns to win in a goldfish scenario? Maybe you program those decisions by running a little subroutine that runs through the permutations a million times and picks the one that generates the highest average power on board? You could also add another layer that uses the most mana, because in game 1 when I dont need to hold cards to pitch to bazaar when I dig for an answer, I start hardcasting narcos and such if I have mana.
Preferencing highest # bc that's just generally how it works, particularly g1.
I don't think I care about hardcasting creatures, really, that to me is just not a common enough occurrence to account for. I imagine eventually it could account for mana in a g2/3 scenario, for Depths / Stage. Honestly I'm not super invested in this haha, I write code 40+ hours a week so writing more when I get home is rarely what I want to do.