随机数生成
目录
随机数生成¶
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 实例实现,这在两方面不被推荐它使用了全局状态,这意味着结果会随着代码的变化而变化。
它使用了 RandomState 而不是更现代的 Generator。
出于向后兼容的遗留原因,我们无法改变这一点。请使用
dask.array.random.default_rng()
获取一个 Generator 并使用它的方法代替。Generator.integers
现在是生成离散均匀分布的整数随机数的标准方法。可以使用 endpoint 关键字指定开区间或闭区间。这取代了 randint 和 random_integers。Generator.random
现在是生成浮点随机数的标准方法,它取代了 random_sample。dask.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 文档