将迭代中生成字符串的实例数相加

时间:2011-10-13 17:32:56

标签: python random iteration sum

使用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

在这种情况下,列表是a = ['Hit','Out'],相应的概率由b = [。3,.7]给出。此代码以概率.3和“Out”返回“Hit”概率.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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

说实话,我正在努力遵循代码的逻辑(这是漫长的一天),但这里有几个指示:

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)

并使用itemprob(或两者)。