原作地址:http://blog.csdn.net/kimixuchen/article/details/54755679
以下为推广后的python实现,适用于计算系统经过马尔科夫过程后达到某一终态的概率
import random
#--------------------------------------------------------------------
def change(ob):#一次调整过程
d=[key for key,x in ob.items() if x>0]
a = random.choice(d)
ob[a]=ob[a]-1
return ob
#--------------------------------------------------------------------
def start_equal_end(startob):#判断是否达到终态
if (startob['c']==endob['c'])&(startob['d']==endob['d']):
return 1
else:
return 0
#--------------------------------------------------------------------
def go(num):
count = 0
for i in range(num):#一次实验
dir = {'c': 2, 'd': 2, 'a': 99, 'b': 99} # 实验开始,定义始态
for j in range(6):
dir=change(dir)#一次调整过程
if start_equal_end(dir):#判断调整多次后实验的结果
count=count+1
print(count/num)
#--------------------------------------------------------------------
endob = {'c': 0, 'd': 0, 'a': 99, 'b': 99} # 定义终态
go(500000)
以下为java实现(仅针对该问题),运行速度快很多
import java.util.ArrayList;
import java.util.Random;
public class HearthstoneBoom {
public static void main(String[] args) {
// TODO Auto-generated method stub
Random r=new Random();
int ri;
float count=0;
int round=10000000;
for(int j=0;j<round;j++){
character a=new character(99),b=new character(99),c=new character(2),d=new character(2);
ArrayList<character> list=new ArrayList<character>();
list.add(a);
list.add(b);
list.add(c);
list.add(d);
for(int i = 0;i<6;i++){
ri=r.nextInt(list.size());
list.get(ri).damaged();
if (list.get(ri).life==0){
list.remove(ri);
}
}
if(c.life==0&d.life==0){
count++;
}
}
System.out.println(count/round);
}
}
class character{
int life;
character(int n){
life=n;
}
public void damaged(){
this.life--;
}
}