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()