In [2]:
import random
import numpy as np

'''
获取当前所处状态
'''
def get_i(x):
    for i in range(len(x)):
      if x[i]==1:
          return i

'''
获取下一个状态值
'''
def get_next(prob_list):
    cum_list = np.cumsum(prob_list)
    seed = random.random()
    for i in range(len(prob_list)):
        if seed<cum_list[i]:
            return i

'''
生成新的状态
'''
def gen_i(i, n):
    return [0 if a!=i else 1 for a in range(n)]

'''
输入一个状态,产生新的状态
'''
def trans(x):
    w = [
        [3/11, 3/11, 2/11, 1/11, 1/11, 0, 0, 0, 1/11],
        [2/8, 0, 1/8, 0, 1/8, 1/8, 0, 0, 3/8],
        [0, 1/7, 1/7, 1/7, 0, 0, 1/7, 1/7, 2/7],
        [0, 1/4, 1/4, 1/4, 0, 1/4, 0, 0, 0],
        [2/4, 0, 0, 0, 0, 1/4, 0, 0, 1/4],
        [0, 0, 0, 0, 2/5, 0, 0, 1/5, 2/5],
        [1/2, 0, 1/2, 0, 0, 0, 0, 0, 0],
        [2/5, 1/5, 0, 0, 0, 1/5, 1/5, 0, 0],
        [2/13, 2/13, 1/13, 1/13, 0, 1/13, 0, 2/13, 4/13]
        ]
    start = get_i(x)
    prob_list = w[start]
    n = len(w)
    x = gen_i(get_next(w[start]), n)
    return x

'''
模拟过程主函数
'''
def train():
    '''
    定义初始状态
    '''
    x = [1, 0, 0, 0, 0, 0, 0, 0, 0]
    listx = []
    for i in range(10000):
        x = trans(x)
        listx.append(x)
    for i in range(9):
        result = [a[i] for a in listx]
        result = sum(result)/10000
        print('处于状态%d的概率:%f' % (i+1, result))

train()


处于状态1的概率:0.199400
处于状态2的概率:0.139000
处于状态3的概率:0.123200
处于状态4的概率:0.070200
处于状态5的概率:0.070900
处于状态6的概率:0.080500
处于状态7的概率:0.031700
处于状态8的概率:0.064800
处于状态9的概率:0.220300