如何在函数中使用random.randint?
我有一个字典:
units['pm']={'as': 2, 'ar': 5, 'de': 2, 'co': 2, 'asr': 7, 'he': 10}
然后我有一组简单的“如果语句”:
p1attackers = 50
p2attackers = 50
p1att= 0
if units['pm']['de'] == 2:
import random
for i in xrange(p1attackers):
key = random.randint(1,10)
if key == 1:
p1att += 1
elif key == 2:
p1att += 1
else:
p1att += 0
基本上,这里的操作是,'random.randit' 随机选择50个数字,如果这些数字是1或2,就会在p1att上加1。有没有办法让这一切变得更简洁或者更短呢?也许可以不使用“如果语句”,而是用一个函数?
5 个回答
0
为了让内容更容易理解,添加了一些括号:
from random import randint
p1attackers = 100 # for example
p1att = sum(1 if (randint(1,10) <= 2) else 0 for _ in range(p1attackers))
或者
p1att = sum(1 for _ in range(p1attackers) if randint(1,10) <= 2)
或者
p1att = sum((randint(1,10) <= 2) for _ in range(p1attackers))
难道Python不是很美吗?
0
在这个for循环里面的所有内容都可以用下面这行代码来替代:
p1att += 1 if (random.randint(1, 10) <= 2) else 0
这段代码是Python的一种条件赋值写法。
1
for i in xrange(p1attackers):
key = random.randint(1,10)
if key == 1:
p1att += 1
elif key == 2:
p1att += 1
这句话的意思是:在一个概率为2/10的情况下,把p1att这个值加1,总共加50次。
你可以把它简化成:
p1att = sum(1 for _ in xrange(p1attackers) if random.randint(1,10) < 3)
1
你可以使用列表推导式:
p1att = sum([1 for _ in xrange(p1attackers) if (random.randint(1, 10) <= 2)])
补充:或者像Adam Cushner建议的那样,你也可以不使用它们:
p1att = sum(1 for _ in xrange(p1attackers) if (random.randint(1, 10) <= 2))
3
你其实可以这样做:
sum((random.randint(1,5) == 1) for i in xrange(50))
另外,如果用numpy的话,我觉得你可以这样写:
np.random.binomial(50, .2)