随机数生成

Dask 的随机数例程通过结合使用 BitGenerator 生成序列,以及使用 Generator 利用这些序列从不同的统计分布中采样,来生成伪随机数。

从 Dask 2023.2.1 版本开始,可以使用多种不同的 BitGenerator 类初始化 Generator。它暴露了许多不同的概率分布。传统的 RandomState 随机数例程仍然可用,但被视为已冻结,不会再获得任何更新。

与 NumPy 的差异

Dask 遵循 NumPy 的随机数生成接口,但存在一些差异

  • dask.array.random 下的方法接受 chunks 关键字。

  • Dask 尝试做到后端无关。换句话说,你可以主要将 CuPy 和 NumPy 作为随机数生成的后端互换使用。任何提供类似接口的库也应该可以通过一些努力来使用。

注意事项

  • BitGenerators:生成随机序列的对象。这些由 NumPy 或 CuPy 等后端库提供,通常是填充有 32 位或 64 位随机位序列的无符号整数词。

  • Generators:BitGenerator 生成的随机位序列转换为遵循特定概率分布(如均匀分布、正态分布或二项分布)并在指定区间内的数字序列的对象。

  • Dask 不保证在不同版本中使用相同的数字生成器。这意味着即使使用相同的种子和分布,新版本由 dask.array.random 生成的数字可能与之前版本不同。随着更好算法的发展,位流可能会改变。

  • Dask 不保证与任何第三方库生成的数字保持一致。特别是,即使给定相同的种子和 BitGenerator,Dask 与 NumPy 或 CuPy 生成的数字也会不同。Dask 倾向于生成 SeedSequence 子序列,以并行生成独立的随机数流。

  • 许多 RandomState 方法在 dask.array.random 中作为函数导出。不建议使用这种方式,因为它通过一个全局 RandomState 实例实现,这在两方面不被推荐

    1. 它使用了全局状态,这意味着结果会随着代码的变化而变化。

    2. 它使用了 RandomState 而不是更现代的 Generator。

    出于向后兼容的遗留原因,我们无法改变这一点。请使用 dask.array.random.default_rng() 获取一个 Generator 并使用它的方法代替。

  • Generator.integers 现在是生成离散均匀分布的整数随机数的标准方法。可以使用 endpoint 关键字指定开区间或闭区间。这取代了 randintrandom_integers

  • Generator.random 现在是生成浮点随机数的标准方法,它取代了 random_sampledask.array.random.random 方法为了向后兼容仍然使用 RandomState,新代码应避免使用。请使用 Generator.random 代替。

快速入门

调用 default_rng 获取 Generator 的新实例,然后调用其方法从不同的分布中获取样本。默认情况下,Generator 使用 PCG64 提供的位流,与 RandomState 中使用的传统 MT19937 相比,PCG64 具有更好的统计特性。

# Do this (new version)
import dask.array as da
rng = da.random.default_rng()
vals = rng.standard_normal(10)
more_vals = rng.standard_normal(10)

# instead of this (legacy version)
import dask.array as da
vals = da.random.standard_normal(10)
more_vals = da.random.standard_normal(10)

更多信息,请参阅 NumPy 文档