# How many colored sources do you need? (GRN update)

Oct 4th, 2018
2,560
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. package howmanysourcesupdate;
2.
3. import java.util.Arrays.*;
4. import java.util.Random;
5.
6. public class HowManySourcesUpdate {
7.
8. public static void main(String[] args) {
9.
10. Deck deck=new Deck();
11. int NrIterations=1000000;
12.
13. //Manually set the type of card that we're interested to cast here
14. int NrGoodLandsNeeded=3;
15. int TurnAllowed=6;
16. //We will look for the probability of casting a spell with CMC TurnAllowed on turn TurnAllowed that requires NrGoodLandsNeeded (which is no larger than TurnAllowed) colored mana of a certain color in its cost.
17. //For example, for a 2WW Wrath of God, we use TurnAllowed=4 and NrGoodLandsNeeded=2.
18.
19. //Initialize the contents of the deck
20. int NrCards=40;
21. int NrLands=17;
22. //Note that the final element needed to describe a deck (NrGoodLands) is set later, as we iterate over the various possible values
23.
24. //Declare other variables
25. int CardType; //Variable used to reference the type of card drawn from the deck
26. int LandsInHand; //This will describe the total amount of lands in your hand
27. int GoodLandsInHand; //This will describe the number of lands that can produce the right color in your hand
28. int StartingHandSize;
29. boolean Mulligan;
30. boolean GoodLandOnTop;
31.
32. for (int NrGoodLands=3; NrGoodLands<=17; NrGoodLands++){
33.
34. double CountOK=0.0; //This will be the number of relevant games where you draw enough lands and the right colored sources
35. double CountConditional=0.0; //This will be the number of relevant games where you draw enough lands
36.
37. for (int i=1; i<=NrIterations; i++){
38.
39. //Draw opening 7
40. deck.SetDeck(NrLands, NrGoodLands, NrCards);
41. LandsInHand=0;
42. GoodLandsInHand=0;
43. for (int j=1; j<=7; j++){
44. CardType=deck.DrawCard();
45. if (CardType<3) {LandsInHand++;}
46. if (CardType==1) {GoodLandsInHand++;}
47. }
48. StartingHandSize=7;
49. Mulligan=false;
50. if (LandsInHand<2) {Mulligan=true;}
51. if (LandsInHand>5) {Mulligan=true;}
52.
53. //Mulligan to 6
54. if (Mulligan){
55. deck.SetDeck(NrLands, NrGoodLands, NrCards);
56. LandsInHand=0;
57. GoodLandsInHand=0;
58. for (int j=1; j<=6; j++){
59. CardType=deck.DrawCard();
60. if (CardType<3) {LandsInHand++;}
61. if (CardType==1) {GoodLandsInHand++;}
62. }
63. StartingHandSize=6;
64. Mulligan=false;
65. if (LandsInHand<2) {Mulligan=true;}
66. if (LandsInHand>4) {Mulligan=true;}
67. }
68.
69. //Mulligan to 5
70. if (Mulligan){
71. deck.SetDeck(NrLands, NrGoodLands, NrCards);
72. LandsInHand=0;
73. GoodLandsInHand=0;
74. for (int j=1; j<=5; j++){
75. CardType=deck.DrawCard();
76. if (CardType<3) {LandsInHand++;}
77. if (CardType==1) {GoodLandsInHand++;}
78. }
79. StartingHandSize=5;
80. Mulligan=false;
81. if (LandsInHand<1) {Mulligan=true;}
82. if (LandsInHand>4) {Mulligan=true;}
83. }
84.
85. //Mulligan to 4
86. if (Mulligan){
87. deck.SetDeck(NrLands, NrGoodLands, NrCards);
88. LandsInHand=0;
89. GoodLandsInHand=0;
90. for (int j=1; j<=4; j++){
91. CardType=deck.DrawCard();
92. if (CardType<3) {LandsInHand++;}
93. if (CardType==1) {GoodLandsInHand++;}
94. }
95. StartingHandSize=4;
96. }
97.
98. //Vancouver mulligan scry
99. //Wwe leave any land that can produce the right color on top and push any other card (both off-color lands and spells) to the bottom
100. GoodLandOnTop=false;
101. if (StartingHandSize<7){
102. CardType=deck.DrawCard();
103. if (CardType==1) {GoodLandOnTop=true;}
104. }
105. //Draw step for turn 2 (remember, we're always on the play)
106. if (TurnAllowed>1){
107. if (GoodLandOnTop) {
108. GoodLandsInHand++; LandsInHand++;
109. }
110. else {
111. CardType=deck.DrawCard();
112. if (CardType<3) {LandsInHand++;}
113. if (CardType==1) {GoodLandsInHand++;}
114. }
115. }
116.
117. //For turns 3 on, draw cards for the number of turns available
118. for (int turn=3; turn<=TurnAllowed; turn++){
119. CardType=deck.DrawCard();
120. if (CardType<3) {LandsInHand++;}
121. if (CardType==1) {GoodLandsInHand++;}
122. }
123.
124. if (GoodLandsInHand>=NrGoodLandsNeeded && LandsInHand>=TurnAllowed) {CountOK++;}
125. if (LandsInHand>=TurnAllowed) {CountConditional++;}
126.
127. } // end of 1,000,000 iterations
128.
129. //System.out.println("With "+NrGoodLands+" good lands: Prob="+CountOK/CountConditional);
130. System.out.println(CountOK/CountConditional);
131. }
132. }
133. }
134.
135. class Deck {
136. int NumberOfLands;
137. int NumberOfGoodLands;
138. int NumberOfCards;
139.
140. void SetDeck (int NrLands, int NrGoodLands, int NrCards) {
141. NumberOfLands=NrLands;
142. NumberOfGoodLands=NrGoodLands;
143. NumberOfCards=NrCards;
144. }
145.
146. int DrawCard (){
147. Random generator = new Random();
148. int RandomIntegerBetweenOneAndDeckSize=generator.nextInt( this.NumberOfCards)+1;
149. int CardType=0;
150. int GoodLandCutoff=NumberOfGoodLands;
151. int LandCutoff=NumberOfLands;
152.
153. if (RandomIntegerBetweenOneAndDeckSize<=GoodLandCutoff) {CardType=1; this.NumberOfGoodLands--; this.NumberOfLands--; this.NumberOfCards--;}
154. if (RandomIntegerBetweenOneAndDeckSize>GoodLandCutoff && RandomIntegerBetweenOneAndDeckSize<=LandCutoff) {CardType=2; this.NumberOfLands--; this.NumberOfCards--;}
155. if (RandomIntegerBetweenOneAndDeckSize>LandCutoff) {CardType=3; this.NumberOfCards--;}
156. return CardType;
157. }
158.
159.
160. }
RAW Paste Data