Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ghitulavarunner;
- /*ASSUMPTIONS:
- - We consider a 60-deck with a 60-card deck with 24 lands, 4 Ghitu Lavarunner, and a certain number of spells.
- - We mulligan a hand if it contains 0, 1, 6, or 7 lands. In case of a mulligan, we ignore the free scry.
- - We assume that we are always able to cast any spell we draw. That is, the availability of colored mana to cast our spells is disregarded. This assumption is reasonable if the majority of our spells cost one or two mana. Suitably, those are exactly the type of spells that are ideal to support Ghitu Lavarunner.
- - We are on the play and on the draw with equal 50-50 probability.
- - We consider the following question: If I have a Ghitu Lavarunner in hand on turn 2 (or any other turn number to be manually adjusted in the SimulateGame function), then what is the probability of also having drawn two spells? In other words, we determine a conditional probability for settings where at least one of our cards (not necessarily the first one we draw) is already taken up by a Ghitu Lavarunner.
- */
- import java.util.Arrays.*;
- import java.util.Random;
- public class GhituLavarunner{
- public static void main(String[] args) {
- Deck deck=new Deck();
- //CardType 1 is a land
- //CardType 2 is a Ghitu Lavarunner
- //CardType 3 is a spell
- //CardType 4 is not used
- //CardType 5 is another card
- for (int NrSpells=9; NrSpells<=26; NrSpells++){
- deck.SetDeck(24,4,NrSpells,0,60-28-NrSpells);
- double Probability=ProbabilityForRandomHand(deck,7,10000000);
- //System.out.print("Probability of having a legend in games where you have a Mox Amber after mulls in a deck with "+NrLegends+" legends: ");
- System.out.println(Math.round(Probability*10000)/100.0);
- }
- }//end of main
- public static double ProbabilityForRandomHand(Deck deck, int StartingCards, int NumberOfIterations){
- Deck remainingdeck=new Deck();
- double NumberOfGamesWithfavorableOutcome=0;
- double NumberOfGamesWithSpellMastery=0;
- //On the play
- for (int IterationCounter=1; IterationCounter<=NumberOfIterations; IterationCounter++){
- OpeningHand openinghand=GiveOpeningHandAfterMulls(deck, StartingCards);
- remainingdeck.SetDeck(deck.NumberOfLands-openinghand.NumberOfLands,deck.NumberOfCardType2-openinghand.NumberOfCardType2,deck.NumberOfCardType3-openinghand.NumberOfCardType3,deck.NumberOfCardType4-openinghand.NumberOfCardType4,deck.NumberOfSpells-openinghand.NumberOfSpells);
- int Outcome=SimulateGame(remainingdeck,openinghand,true);
- if (Outcome==0) {NumberOfGamesWithfavorableOutcome++; NumberOfGamesWithSpellMastery++;}
- if (Outcome==1) {NumberOfGamesWithSpellMastery++;}
- }
- //On the draw; this is a copy-paste where the only change is that the boolean is now false
- for (int IterationCounter=1; IterationCounter<=NumberOfIterations; IterationCounter++){
- OpeningHand openinghand=GiveOpeningHandAfterMulls(deck, StartingCards);
- remainingdeck.SetDeck(deck.NumberOfLands-openinghand.NumberOfLands,deck.NumberOfCardType2-openinghand.NumberOfCardType2,deck.NumberOfCardType3-openinghand.NumberOfCardType3,deck.NumberOfCardType4-openinghand.NumberOfCardType4,deck.NumberOfSpells-openinghand.NumberOfSpells);
- int Outcome=SimulateGame(remainingdeck,openinghand,false);
- if (Outcome==0) {NumberOfGamesWithfavorableOutcome++; NumberOfGamesWithSpellMastery++;}
- if (Outcome==1) {NumberOfGamesWithSpellMastery++;}
- }
- return NumberOfGamesWithfavorableOutcome/(NumberOfGamesWithSpellMastery+0.0);
- }//end of AverageKillTurnForRandomHand
- static OpeningHand GiveOpeningHandAfterMulls (Deck deck, int StartingCards) {
- Deck remainingdeck=new Deck();
- OpeningHand openinghand=new OpeningHand();
- int TypeOfCardDrawn;
- boolean KeepHand=false;
- for (int OpeningHandSize=7; OpeningHandSize>=1; OpeningHandSize--){
- if (KeepHand==false){
- openinghand.SetHand(0,0,0,0,0);
- remainingdeck.SetDeck(deck.NumberOfLands,deck.NumberOfCardType2,deck.NumberOfCardType3,deck.NumberOfCardType4,deck.NumberOfSpells);
- int NumberOfLands=0;
- for (int CardsDrawn=0; CardsDrawn<OpeningHandSize; CardsDrawn++){
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==1) {openinghand.NumberOfLands++; NumberOfLands++;}
- if (TypeOfCardDrawn==2) {openinghand.NumberOfCardType2++;}
- if (TypeOfCardDrawn==3) {openinghand.NumberOfCardType3++;}
- if (TypeOfCardDrawn==4) {openinghand.NumberOfCardType4++;}
- if (TypeOfCardDrawn==5) {openinghand.NumberOfSpells++;}
- }
- KeepHand=true;
- if (OpeningHandSize>1) {
- // We mulligan a hand if it contains 0, 1, 6, or 7 lands
- if (NumberOfLands<=1 || NumberOfLands>=6) {KeepHand=false;}
- //
- }
- }
- }
- return openinghand;
- }//end of GiveOpeningHandAfterMulls
- static int SimulateGame(Deck remainingdeck, OpeningHand openinghand, boolean OnThePlay) {
- //Initializing
- int TypeOfCardDrawn=0;
- int Outcome=2;
- int Turn=4;
- int GhituLavarunnerInHand=openinghand.NumberOfCardType2;
- int SpellInHand=openinghand.NumberOfCardType3;
- //Turn 1
- if (OnThePlay==false) {
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==2) {GhituLavarunnerInHand++;}
- if (TypeOfCardDrawn==3) {SpellInHand++;}
- }
- //Turn 2
- if (Turn>=2){
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==2) {GhituLavarunnerInHand++;}
- if (TypeOfCardDrawn==3) {SpellInHand++;}
- }
- //Turn 3
- if (Turn>=3){
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==2) {GhituLavarunnerInHand++;}
- if (TypeOfCardDrawn==3) {SpellInHand++;}
- }
- //Turn 4
- if (Turn>=4){
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==2) {GhituLavarunnerInHand++;}
- if (TypeOfCardDrawn==3) {SpellInHand++;}
- }
- if (GhituLavarunnerInHand>=1 && SpellInHand>=2) {Outcome=0;}
- if (GhituLavarunnerInHand>=1 && SpellInHand<2) {Outcome=1;}
- return Outcome;
- }//end of SimulateGame
- }
- class OpeningHand {
- int NumberOfLands;
- int NumberOfCardType2;
- int NumberOfCardType3;
- int NumberOfCardType4;
- int NumberOfSpells;
- int NrOfCards(){
- return NumberOfLands+NumberOfCardType2+NumberOfCardType3+NumberOfCardType4+NumberOfSpells;
- }
- void SetHand (int Nr1, int Nr2, int Nr3, int Nr4, int Nr5) {
- NumberOfLands=Nr1;
- NumberOfCardType2=Nr2;
- NumberOfCardType3=Nr3;
- NumberOfCardType4=Nr4;
- NumberOfSpells=Nr5;
- }
- }//end of OpeningHand
- class Deck {
- int NumberOfLands;
- int NumberOfCardType2;
- int NumberOfCardType3;
- int NumberOfCardType4;
- int NumberOfSpells;
- void SetDeck (int Nr1, int Nr2, int Nr3, int Nr4, int Nr5) {
- NumberOfLands=Nr1;
- NumberOfCardType2=Nr2;
- NumberOfCardType3=Nr3;
- NumberOfCardType4=Nr4;
- NumberOfSpells=Nr5;
- }
- int NrOfCards(){
- return NumberOfLands+NumberOfCardType2+NumberOfCardType3+NumberOfCardType4+NumberOfSpells;
- }
- int DrawCard (){
- Random generator = new Random();
- int CardType=0;
- int RandomIntegerBetweenOneAndDeckSize=generator.nextInt( this.NrOfCards() )+1;
- int OneCutoff=NumberOfLands;
- int TwoCutoff=OneCutoff+NumberOfCardType2;
- int ThreeCutoff=TwoCutoff+NumberOfCardType3;
- int FourCutoff=ThreeCutoff+NumberOfCardType4;
- int FiveCutoff=FourCutoff+NumberOfSpells;
- if (RandomIntegerBetweenOneAndDeckSize<=OneCutoff) {CardType=1; this.NumberOfLands--;}
- if (RandomIntegerBetweenOneAndDeckSize>OneCutoff && RandomIntegerBetweenOneAndDeckSize<=TwoCutoff) {CardType=2; this.NumberOfCardType2--;}
- if (RandomIntegerBetweenOneAndDeckSize>TwoCutoff && RandomIntegerBetweenOneAndDeckSize<=ThreeCutoff) {CardType=3; this.NumberOfCardType3--;}
- if (RandomIntegerBetweenOneAndDeckSize>ThreeCutoff && RandomIntegerBetweenOneAndDeckSize<=FourCutoff) {CardType=4; this.NumberOfCardType4--;}
- if (RandomIntegerBetweenOneAndDeckSize>FourCutoff && RandomIntegerBetweenOneAndDeckSize<=FiveCutoff) {CardType=5; this.NumberOfSpells--;}
- return CardType;
- }
- }//end of Deck
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement