真实的Python随机百分比

9

我不理解在《Real Python》书中找到的这个语法,希望能得到一些澄清。

from __future__ import division
from random import random

total_A_wins = 0
total_B_wins = 0

trials = 100000
for trial in range(0, trials):
    A_win = 0
    B_win = 0
    if random() < .87: # 1st region
        A_win += 1
    else:
        B_win += 1
    # determine overall election outcome
    if A_win > B_win:
        total_A_wins += 1
    else:
        total_B_wins += 1

print "Probability A wins:", total_A_wins/trials
print "Probability B wins:", total_B_wins/trials

在这个例子中,他们说A有87%的获胜机会。但是,如何使用random() < .87表示A会获得87%的胜利?
当我阅读它时,它说: 如果随机数小于.87
我希望澄清的是random小于.87对我来说没有意义。
1个回答

18
random.random()的返回值在区间[0.0, 1.0)上均匀分布(包括0.0但不包括1.0),因此它有平等的机会命中该范围内的任何值。
这意味着87%的时间会选择小于0.87的值。
如果您将其更改为测试random() < 1.0,那么测试将始终通过,100%的时间。 如果您将其更改为random() < 0.0,则永远不会通过,所以0%的时间。并且由于分布是均匀的,random() < 0.5将在一半的时间内为True,因为另一半的时间内将选择范围 [0.5, 1.0)内的值。
您可以把它看作是掷骰子;使用标准6面骰子,您100%的时间都会掷出小于7的值。 您永远不会掷出小于1的值,50%的时间会掷出小于4的值(即1、2或3),而66.67%的时间会掷出小于5的值(因此所有投掷的三分之二)。random.random()返回值只是比仅具有6个不同值的值范围要大得多。

在看到statsd客户端限制发送速率后,我也有同样的问题:https://github.com/jsocol/pystatsd/blob/1c90b9fdf322680e2625da659abc2aa5d79b5bff/statsd/client/base.py#L63-L64 - 感谢您的回答。 - Yuriy Vasylenko

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