按百分比获取随机布尔值

14

我想获得一个具有加权百分比的随机布尔值。例如,我希望用户传入一个百分比(即60),生成器将在随机选择true时60%的时间内选择。

我现在拥有的是:

def reset(percent=50):
    prob = random.randrange(0,100)
    if prob > percent:
        return True
    else:
        return False

有更好的方法吗?这看起来效率低下、繁琐。我不需要它完美无缺,因为它只是用来模拟数据,但我需要它尽可能快。

我已经搜索了(Google / SO),但没有找到其他相关问题。


可能是重复的问题:基于概率的真或假输出 - Martin Thoma
4个回答

27

只需返回测试:

def reset(percent=50):
    return random.randrange(100) < percent
因为一个 < 小于运算符的结果已经是布尔值,你不需要提供一个开始值。请注意,如果您想要在给定百分比时返回 True,则需要使用“小于”;如果 percent = 100,则所有通过 randrange() 产生的值都应该小于 percent 值才能返回True

1
我还要指出的是,通常情况下,接受从0到1的浮点数更为常见 - 百分比是一个有用的人类概念,但在计算机中,这可能意味着无谓地进行乘法运算。浮点数将提供更大的机会范围,并且可能更快(只需使用random.random()而不是randrange())。 - Gareth Latty
@Lattyware:当然,但如果用户输入已经以整数值给出,那就没什么关系了。 - Martijn Pieters
@rjbez:真的吗?哇!:-P - Martijn Pieters
@MartijnPieters 我认为关系是反过来的,请看我的答案并进行更改。 - Gregory
@Gregory:你说得对;我以前从来没有关注过这个,因为我注重的是简化该方法,而不是它是否正确。现在已经更新了。 - Martijn Pieters
显示剩余3条评论

2
怎么样:
def reset(percent=50):
    return random.randrange(0, 100) > percent

1

@rjbez 您要求一个函数,在 X 百分比的时间内返回 true。当 X == 0% 时,它应该总是返回 false。当 X == 100% 时,它应该总是返回 true。当前已接受的答案已经被修正,并具有适当的关系。

def reset(percent=50):
    return random.randrange(100) < percent

谢谢,我想我应该加上一条关于那个的注释。我很久以前就已经弄清楚了并更新了代码,但没有更新问题。 - rjbez

0

只需使用PyProbs库。它非常易于使用。

>>> from PyProbs import Probability as pr
>>> 
>>> # You can pass float (i.e. 0.5, 0.157), int (i.e. 1, 0) or str (i.e. '60%', '3/11')
>>> pr.Prob('50%')
False
>>> pr.Prob('50%', num=5)
[False, False, False, True, False]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接