
一个玩桌游的朋友问我:一个卡池一共有16个系列,每个系列都有五张卡,玩家获得一个补充包会随机获得五张不同的卡。假设每张卡的稀有度一致,问一个玩家要凑出一个系列的五张卡需要撕多少包的平均期望是多少。
本来想考数学方法算出来的,结果发现大学的东西都忘光了……不管是欧拉还是微积分……算了算了……大致思考了下,这个数应该是收敛的,用程序跑几轮估计大概值就出来了,于是有了下面代码
package myProject;
import java.util.HashSet;
import java.util.Iterator;public class pickCard {
private static int TURN = 100000; //进行轮数
private static int TYPE_NUM = 5; //每系列卡牌数量 (整套卡牌数量 /每系列卡牌数量)
private static int TYPES = 16; //卡牌类型数
private static int NUM_OF_EACH_BAG = 5; //每包数量
private static int ALL_CARDS_NUM = NUM_OF_EACH_BAG * TYPES; //整套卡牌数量
public static void main(String[] args) {double CountBags = 0;
for(int i=0; iint tempBag = getoneType();
CountBags += tempBag;
System.out.println("第" + (i+1) + "次成功,开了" + tempBag + "包");
}
System.out.println("CountBags=" + CountBags/TURN);
}
private static int getRandom(){
int ran = (int) Math.floor( Math.random()*ALL_CARDS_NUM );
return ran;
}
private static HashSetopenoneBag(){
int nowCard = 0;
HashSetoneBagCards = new HashSet ();
do {
nowCard = getRandom();
if(nowCard >= 0){
oneBagCards.add(nowCard);
}
} while (oneBagCards.size() < NUM_OF_EACH_BAG);
return oneBagCards;
}
private static int getoneType(){
int bagNum = 0;
int[] getCards = new int[ALL_CARDS_NUM];
boolean isGoOn = true;
HashSetpickCard = new HashSet ();
for(int i=0; igetCards[i] = 0;
}do{
bagNum++;
pickCard = openoneBag();
Iteratoriterator = pickCard.iterator();
while (iterator.hasNext()) {
int k = (int)iterator.next();
getCards[k] = 1;
}
isGoOn = !haveoneType(getCards);
}while(isGoOn);
return bagNum;
}
private static boolean haveoneType(int[] getCards) {
for(int i = 0; i < TYPES;i++){
int all = 0;
for(int k =0; k < NUM_OF_EACH_BAG ; k++){
all += getCards[i*TYPE_NUM + k]; //按顺序自动每种系列进行统计
}
if(all == TYPE_NUM){
return true;
}
}
return false;
}
}
最终结果,12.44左右~~妥妥哒,另外在此基础上,要增加稀有度之类的设定,也不太困难的鸭子。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)