选择按概率加权的随机状态

Choosing a random state weighted by probability

我正在尝试为自定义 RL 算法创建一个随机环境,此代码的目的是采用有序字典(示例:OrderedDict([(0,1),(1,0), (2 ,0),(3,0)]) 元组中的第一个数字是 indx 第二个是概率)和 return 随机加权的新状态,该状态按有序字典中定义的状态发生的概率加权(在示例中上面有 100% 的机会进入状态 0)

我遇到的问题是,出于某种原因,当 indx 为 0(对于上述示例输入)时,概率也为 0。我预计概率为 1。

在同样的情况下 pcloud[0] == 1 这就是我想要的。这意味着我在使用 enumerate 时有一些错误,但我不知道它是什么。

def collapse(pcloud): 
        randomnum  = Random.uniform(0,1)
        threshold = 0

        for indx , probability in enumerate(pcloud):
            threshold += probability
            if randomnum <= threshold:                    
                return indx
        raise ValueError("For some reason the probabilities can't be compared with the <= operator.")
        #it should never get here.
        return

到运行代码创建有序字典。

from collections import OrderedDict
import random as Random
#all probabilities should sum to 1
pcloud = OrderedDict()
pcloud[0] = 1
pcloud[1] = 0
pcloud[2] = 0
pcloud[3] = 0

#then run the function
print collapse(pcloud)

您不应该仅仅因为涉及索引就使用 enumerate。这些索引已经作为您的 OrderedDict 的键存在。您需要遍历 OrderedDict 的键值对,因此您应该在 items()iteritems() 上遍历 Python 2(因为 items() 在Python 2):

for index, probability in pcloud.items():
    ...