확률 적 시뮬레이션에서 자주 발생하는 문제는 몇 가지 이벤트 중 어느 것이 발생하는지 계산하는 것입니다. 이것은 일반적으로 각 이벤트에 대한 확률을 가지고 수행됩니다. 그런 다음 난수를 생성 한 다음 가능한 이벤트의 반복을 통해 확률의 합이 난수를 초과 할 때까지 반복합니다.최대 dict 값을 임계 값까지 합산 - itertools.takewhile?
여기 내가 원하는 것을 수행하는 코드가 있지만 더 좋은 방법을 수행하고 있습니다. 가능성이 takewhile
를 사용하여 - - getEvent을 정의하는보다 컴팩트 한 방법이 될 수있을거야처럼
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
는 느낌하지만 난 그것을 찾을 수 없습니다.
나는 이것이 내 코드가 대부분의 시간을 보내는 곳이라고 생각하기 때문에 최대한의 효율성을 보였습니다.
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 %)입니다. 따라서 각 이벤트의 확률은 순서에 관계없이 동일합니다.
1 이벤트를 선택하고 해당 이벤트를 해당 확률로 선택하겠습니다.
여기서 이벤트 순서가 중요합니까? – thefourtheye
알 수없는 순서로 키 반복을 묻는다면 문제가되지 않습니다. (상황이 빨라지는 확률로 내림차순으로 반복하는 것이 맞는지는 모르겠지만 사전에 그 순서를 모를 것입니다.) – Joel
그리고 임계 값을 초과하는 이벤트를 원하십니까? – thefourtheye