计算总值直到阈值 - itertools.takewhile?

2024-05-16 19:39:50 发布

您现在位置:Python中文网/ 问答频道 /正文

随机模拟中经常出现的一个问题是计算几个事件中的哪个发生。这通常是通过每个事件的概率来实现的。然后生成一个随机数,然后遍历可能的事件,直到找到它们的概率之和超过随机数的地方。你知道吗

这是我想要的代码,但我正在寻找更好的方法。你知道吗

import random

def getEvent(eventProbabilities,probability):
    S = 0
    for key in eventProbabilities.keys():
        S += eventProbabilities[key]
        if S>= probability:   #key is the event to happen.
            break
    return key

x = {'event1' : 0.1 , 'event2' : 0.2 , 'event3' : 0.2 , 'event4' : 0.4, 'event5' : 0.1} #values sum to 1.
p = random.random()  #random number between 0 and 1.
event = getEvent(x,p)
print p, event

我觉得应该有一种更简洁的方法来定义getEvent—可能是使用takewhile—但是我找不到它。你知道吗

我追求的是最高效率,因为我认为这是我的代码将花费大部分时间的地方。你知道吗

有没有一种方法可以通过itertools(或其他方式)提高效率?你知道吗

在下面添加编辑,评论我们是否关心迭代顺序。

您将注意到这些键将按某种顺序进行处理。这个顺序与随机数p无关。让我们考虑这样的情况,它按照我列出的顺序处理它们。如果p<=0.1,那么它将返回event1,因此有10%的可能性是event1。如果0.1<p<0.3它将返回event2(所以有20%的概率)。现在让我们考虑一个不同的顺序。假设它的顺序相反。在这种情况下,如果0.9<p,我们得到event1(10%),而如果0.7<p<=0.9,我们得到event2(20%)。所以每个事件的概率是相同的,不管顺序如何。你知道吗

我只想选择一个事件,我想用相应的概率选择那个事件。你知道吗


Tags: to方法key代码event顺序地方事件
1条回答
网友
1楼 · 发布于 2024-05-16 19:39:50

如果我理解正确,您只需要从列表中以给定的概率选择一个元素。为什么不使用numpy?你知道吗

>>> x = {'event1': 0.1 , 'event2': 0.2 , 'event3': 0.2 , 'event4': 0.4, 
         'event5': 0.1}
>>> events, p = zip(*x.items())
>>> np.random.choice(events, p=p, replace=False)
'event4'

相关问题 更多 >