【问题标题】:np.random.binomial() vs random.choices() for simulating coin flips用于模拟硬币翻转的 np.random.binomial() 与 random.choices()
【发布时间】:2021-05-26 11:22:39
【问题描述】:

我想使用 Python 模拟公平硬币的重复翻转。两种方法似乎是合理的,如下面的代码所示。请问它们是等价的吗?如果是,是否有充分的理由偏爱其中一个?

import random
import numpy as np

n = 10
p = 0.5

print(np.random.binomial(n, p))

results = random.choices([True, False], k=n)
print(results.count(True))

【问题讨论】:

    标签: python numpy random


    【解决方案1】:

    实际上它们是等价的。

    • random.choices 选择 TrueFalse 并替换,然后计算 True 以这种方式选择的次数。
    • binomial 使用给定的 p 参数返回 10 次伯努利试验的总和。因为这里是p = 0.5,所以相当于choices

    random.choices 方法的优点是不需要外部库,因为random 模块是 Python 标准库的一部分,因此默认情况下在 Python 中可用。另一方面,二项分布可让您模拟抛掷偏向硬币的正面数量,而不仅仅是公平硬币。

    但是,numpy.random.* 函数,例如 numpy.random.binomial,已成为 NumPy 1.17 的遗留函数,出于向后兼容性的原因,它们的算法预计将保持原样。但是,该版本并未弃用任何 numpy.random.* 函数,因此它们暂时仍然可用。另见this question。如果您使用 NumPy 1.17 或更高版本,则应在较新的应用程序中使用 1.17 版中引入的新系统,包括 numpy.random.Generator。以下示例使用Generatorbinomial 方法:gen=np.random.default_rng(); print(gen.binomial(10, 0.5))。另见:Are numpy binomial random numbers inefficient?

    NumPy 中提供了第三种等效方法:choice 方法。请注意,我们再次使用 NumPy 的 Generator 而不是传统的伪随机系统。

    gen=np.random.default_rng();
    print(np.sum(gen.choice([0,1],size=10)))
    

    【讨论】:

      【解决方案2】:

      进一步说彼得所说:对于您的参数,您的替代方案之间没有明显差异,它们都只需要一两微秒即可执行。

      如果你增加n 一点,例如到 1000,那么 numpy 版本将开始明显更快。这是因为它不需要建立一个列表然后计算该列表中的元素,它知道如何计算确切的值。

      如果你将n 增加到几十亿,那么你必须使用numpy 版本,因为你将没有足够的内存来存储choices 生成的中间列表。

      Asymptoticallychoices 的缩放比例为 O(n),而 Numpy 的 binomial 为 O(1)。

      【讨论】:

        猜你喜欢
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 2010-10-03
        • 2019-01-07
        • 2020-07-17
        • 2021-06-19
        相关资源
        最近更新 更多