7

NumPy 现在建议新代码使用defacult_rng()实例而不是新代码这一事实numpy.random让我开始思考应该如何使用它来产生良好的结果,无论是性能还是统计。

第一个例子是我最初想写的:

import numpy as np

class fancy_name():
  def __init__(self):
    self.rg = np.random.default_rng()
    self.gamma_shape = 1.0
    self.gamma_scale = 1.0

  def public_method(self, input):
    # Do intelligent stuff with input
    return self.rg.gamma(self.gamma_shape, slef.gamma_scale)

但我也考虑过在每个函数调用中创建一个新实例:

import numpy as np

class fancy_name():
  def __init__(self):
    self.gamma_shape = 1.0
    self.gamma_scale = 1.0

  def public_method(self, input):
    # Do intelligent stuff with input
    rg = np.random.default_rng()
    return rg.gamma(self.gamma_shape, slef.gamma_scale)

第三种选择是将 rng 作为函数调用中的参数传递。这样,相同的 rng 也可以用于代码的其他部分。

这用于模拟环境中,该环境将经常被调用来采样,例如,转换时间。

我想问题是这三种方法中的任何一种是否存在论据,是否存在某种实践?

此外,任何对使用这些随机数生成器的更深入解释的参考(除了 NumPy 文档和随机采样文章)都非常有趣!

4

1 回答 1

6

default_rng()不是单身人士。它创建了一个由默认 BitGenerator 类的新实例支持新生成器。引用文档

使用默认的 BitGenerator (PCG64)构造一个新的生成器。

...

如果种子不是 BitGenerator 或 Generator,则实例化一个的BitGenerator。此函数不管理默认全局实例。

这也可以通过经验进行测试:

In [1]: import numpy

In [2]: numpy.random.default_rng() is numpy.random.default_rng()
Out[2]: False

这是昂贵的。您通常应该default_rng()在程序中调用一次并将生成器传递给任何需要它的东西。(是的,这很尴尬。)

于 2020-05-08T09:45:49.843 回答