使用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
非常感谢任何帮助。另外,有没有人知道学习蒙特卡罗模拟的好资源?
答案 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)
并使用item
或prob
(或两者)。