【问题标题】:NumPy equivalent to random.getrandbits()NumPy 等价于 random.getrandbits()
【发布时间】:2022-01-11 14:54:09
【问题描述】:

我正在创建 random.Random() 的子类,其中生成器实际上是 NumPy 的默认 Random Generator

这样做的原因是,我可以通过 SeedSequence 对象使用 NumPy 的生成器来利用并行执行。

重写方法random()seed() 相当容易,但是,我还需要重写方法getrandbits(),但我找不到任何Numpy 的等效功能/解决方案。 getrandbits()random.Random() 类的所有其他函数大量使用。

【问题讨论】:

  • 出于好奇,为什么需要子类化 stdlib 随机生成器?
  • 您可以查看random.getrandbits 的源并将其移植到numpy
  • @jakub 确实,我的想法是在我眼前有一个更简单的解决方案,我只是没有看到它。查看代码,归结为复制int.from_bytes(_urandom(numbytes), 'big')。如果我没有得到更简单的预期答案,我会继续努力。
  • @AndrasDeak 最终目标是使用该子类来创建 faker.Faker 对象。 Faker 中的所有函数都使用底层的随机生成器,特别是函数random()getrandbits()。然而,random.Random() 类不能并行化,并且 BitGenerator 不能高级 (PCG64 can)。
  • @jakub 这可能是解决方案的要点,除非有更简单、更高级别的功能。 int.from_bytes(np.random.default_rng().bytes(numbytes), 'big')。谢谢!

标签: python numpy random


【解决方案1】:

正如@jakub 在 cmets 中提到的,最简单的方法是将源代码移植到 NumPy。

    def getrandbits(self, k):
        print()
        """getrandbits(k) -> x.  Generates an int with k random bits."""
        if k < 0:
            raise ValueError('number of bits must be non-negative')
        numbytes = (k + 7) // 8                       # bits / 8 and rounded up
        x = int.from_bytes(self.rng.bytes(numbytes), 'big')
        return x >> (numbytes * 8 - k)                # trim excess bits

其中self.rngnp.random.Generator 的一个实例。

【讨论】:

  • 您也可以对原始BitGenerator 执行类似操作,因为它返回uint64 ndarray,例如int.from_bytes(bitgen.random_raw(num_u64s, 'big'))
猜你喜欢
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2013-03-29
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多