如何在函数中使用random.randint?

0 投票
5 回答
5528 浏览
提问于 2025-04-17 21:00

我有一个字典:

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)

撰写回答