【发布时间】:2012-05-15 22:30:28
【问题描述】:
from random import uniform
prob = [0.25,0.30,0.45]
def onetrial(prob):
u=uniform(0,1)
if 0 < u <= prob[0]:
return 11
if prob[0] < u <= prob[0]+prob[1]:
return 23
if prob[0]+prob[1] < u <= prob[0]+prob[1]+prob[2]:
return 39
print onetrial(prob)
我想知道如何使用一些 for 循环技术来减少 def 中的重复部分。谢谢。
【问题讨论】:
-
看起来像是某种类型的轮盘赌选择.. 我不认为代码是不清楚的,
prob会变大还是变化?我只是好奇这样做的动机 - 谢谢 -
你不需要测试
<部分(由前面的if处理)。 -
如果您假设概率总和为 1.0,您可以完全跳过最后一个
if。如果舍入导致您错过最后一个条件并跑出函数的末尾,这也会更安全。 -
虽然它变得凌乱并且可能不是你所要求的,但它可以作为一个疯狂的单线器来完成(可以分成可理解的位),因为你有
u:[11,23,39][map(lambda x: u<=x, [sum(prob[0:i+1]) for i in xrange(len(prob))]).index(True)] -
谢谢大家。 @Levon,代码是用概率质量函数(prob)生成一个随机变量X。