Суммируя количество экземпляров, строка генерируется в итерации - PullRequest
0 голосов
/ 13 октября 2011

Работа в Python 2.7.

Я пытаюсь найти способ случайного блуждания.Но сначала у меня возникают проблемы с суммированием количества результатов, которые я получаю от генератора случайных чисел.

Первый фрагмент кода:

def random_pick(some_list, probabilities):
x = random.uniform(0,1)
cumulative_probability = 0.0
for item, item_probability in zip(some_list, probabilities):
    cumulative_probability += item_probability
    if x < cumulative_probability: break
return item

В этом случае список представляет собой =['Hit', 'Out'] и соответствующие вероятности определяются как b = [.3, .7].Этот код возвращает «Hit» с вероятностью .3 и «Out» с вероятностью .7.

Затем у меня есть код для создания грубого симулятора среднего уровня игрока на основе этих вероятностей:

def battingAverage(atBats, i, some_list=a, probabilities=b):
for i in range(1,atBats):
    if random_pick(a, b) == 'Hit':
        hit = random_pick(a, b)
        print '%.0f: %s' % (1, 'Hit')
    elif random_pick(a, b) == 'Out':
        out = random_pick(a, b)
        print '%.0f: %s' % (2, 'Out')

Когда я запускаю это, я получаю случайное поколение столько летучих мышей, сколько я выберу.Но я хотел бы иметь возможность затем суммировать количество экземпляров или и тех, и других, но я не смог понять, как это сделать.Я попытался использовать код, подобный приведенному ниже, после изменения random_pick для возврата вероятности вместо элемента, но безрезультатно.

def battingAverage(atBats, i, some_list=a, probabilities=b):
num_hits = 0
num_outs = 0
for i in range(1,atBats):
    if random_pick(a, b) == 'Hit':
        hit = (random_pick(a, b))/.3
        num_hits += hit
    elif random_pick(a, b) == 'Out':
        out = (random_pick(a, b))/7
        num_outs += out
print num_hits, num_outs

Любая помощь будет принята с благодарностью.Кроме того, кто-нибудь знает хороший ресурс для изучения симуляции Монте-Карло?

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Если честно, я изо всех сил стараюсь следовать логике вашего кода (это был долгий день), но вот пара указателей:

1) Когда вы делаете такие вещи, как:

if random_pick(a, b) == 'Hit':
   ...
elif random_pick(a, b) == 'Out':
   ...

вы звоните random_pick() дважды, поэтому вы проводите два независимых моделирования вместо одного. В результате может случиться так, что ни одна из двух ветвей не будет выполнена. Чтобы исправить, вызовите random_pick() один раз, сохраните результат, а затем ответьте на этот результат.

2) Что касается вашей другой проблемы, Python позволяет вам возвращать несколько значений из функции. Это может быть полезно здесь:

def random_pick(some_list, probabilities):
   ... decide on the item and probability ...
   return item, probability

Затем вы можете назвать это так:

item, prob = random_pick(a, b)

и используйте item или prob (или оба).

2 голосов
/ 13 октября 2011
num_hits = 0
num_outs = 0
for i in range(1, atBats):
    if random_pick(a,b) == 'Hit':
        num_hits += 1
    else:
        num_outs += 1
print num_hits, num_outs
...