📜  Julia 中的随机数生态系统——自然的一面(1)

📅  最后修改于: 2023-12-03 14:43:36.709000             🧑  作者: Mango

Julia 中的随机数生态系统——自然的一面

在 Julia 中,随机数是继函数式编程之后的又一利器。我们可以非常方便地使用内置的随机库以及其他第三方库来生成随机数序列。这篇文章将会介绍 Julia 中的随机数生态系统,会包括以下内容:

  1. Julia 中内置的随机数类
  2. RJMCMC.jl:一个 Monte Carlo 模拟的包
  3. Distributions.jl:处理各种分布的库
  4. RandomNumbers.jl:快速生成高质量随机数的包
Julia 中内置的随机数类

Julia 中的随机数类有两种:MersenneTwisterRandomDevice。前者是一个算法,后者是一个接口,个人认为MersenneTwister更加常用。

using Random
# 默认生成 Mersenne Twister 算法的对象
rng = default_rng()

# 生成随机数
rand(rng, Float64)

其中,rand(rng, rtype) 函数用于生成随机数,第一个参数是随机数类对象,第二个参数是返回随机数值类型,具体的类型可以在 Julia 的文档中查看。

RJMCMC.jl:一个 Monte Carlo 模拟的包

随机过程是蒙特卡罗模拟中经常用到的一种技术,RJMCMC.jl 是 Julia 中一个用于随机过程模拟的包。它提供了种类丰富的算法,当然其中最基础的仍然是 Metropolis-Hastings 算法和 Gibbs 算法。

我们可以使用以下命令来安装 RJMCMC.jl:

using Pkg
Pkg.add("RJMCMC")

然后我们可以编写以下模拟程序:

# 导入 RJMCMC 库
using RJMCMC

# 定义概率分布函数
f(x) = sin(5*pi*x)/(5*pi*x)

# 构造一个 Metropolis-Hastings 算法的 Monte Carlo 对象
# 原函数是 f,初始化为 0.5,步长是 0.02
mc = MetropolisHastings(f, [0.5], 0.02)

# 进行 10^5 轮的 Monte Carlo 模拟,每隔 10000 轮输出信息
rets = mcmc(mc, 100_000, burnin = 50_000, verbose = 10000)

# 打印出随机数序列的统计信息
@show mean(rets), var(rets)
Distributions.jl:处理各种分布的库

Distributions.jl 是 Julia 中一个用于处理各种分布的库。它提供了简便的 API,可以让我们轻松地进行分布函数的生成、抽样、分布拟合等操作。

首先下载 Distributions.jl:

using Pkg
Pkg.add("Distributions")

接着我们可以编写以下代码:

# 导入 Distributions 库
using Distributions

# 生成一个正态分布的对象
nd = Normal(0, 1)

# 生成 10 个随机数
x = rand(nd, 10)

# 查看概率密度函数在 0 处的取值
pdf(nd, 0)

其他一些常见的分布函数可以查看文档。

RandomNumbers.jl:快速生成高质量随机数的包

RandomNumbers.jl 是 Julia 中一个提供高效随机数生成器的库。它主要有以下两个特点:

  1. 提供优秀的随机性能和各种统计质量的随机数生成器。
  2. 提供流式、不可重复、语言无关的随机数序列的 API。

下载:

using Pkg
Pkg.add("RandomNumbers")

接着我们可以编写以下代码:

# 导入 RandomNumbers 库
using RandomNumbers

# 设置随机数序列的种子
rn = RandomNumbers.Xorshifts(1234)

# 生成一个带 N 个元素的随机数序列(类型为 Float64)
N = 10_000_000
x = rand(rn, Float64, N)

使用 RandomNumbers.jl 库可以极大地简化随机序列的生成过程,并提高生成速度。

总结

本文介绍了 Julia 中的随机数生态系统。Julia 提供了两种内置随机数类,用户可以根据需求选择使用;RJMCMC.jl 可以用于随机过程模拟;Distributions.jl 可以处理各种分布;RandomNumbers.jl 可以高效地生成随机序列。这些工具可以极大地简化随机数生成过程,提高生成效率。