Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

rng

控制随机数生成器

说明

示例

rng("default") 使用默认算法和种子初始化 MATLAB® 随机数生成器。出厂默认设置是种子为 0 的梅森旋转生成器。有关更改默认设置和可再现性的信息,请参阅随机数生成器的默认设置随机数生成器的可再现性

rng 函数控制全局流,这决定 randrandirandnrandperm 函数如何产生一系列随机数。要创建一个或多个独立于全局流的流,请参阅 RandStreamRandStream.create

rng(seed) 使用当前生成器算法指定随机数生成器的种子。

  • seed 指定为非负整数,如 rng(1),用该种子初始化随机数生成器。

  • seed 指定为 "shuffle",以根据当前时间初始化生成器种子。

示例

rng(seed,generator) 还指定随机数生成器要使用的算法。例如,rng(2,"philox") 使用种子 2 初始化 Philox 4×32 生成器。

rng(generator) 指定种子为 0 的随机数生成器要使用的算法。此语法等效于 rng(0,generator) (自 R2023b 起)

示例

rng(s) 基于结构体 s 中包含的设置初始化生成器,结构体包含字段 TypeSeedState。结构体 s 必须为以前调用 s = rngs = rng(__) 时返回的结构体。

示例

t = rng 以包含字段 TypeSeedStatet 结构体的形式返回当前随机数生成器的设置。

t = rng(___) 在使用指定的参量更改设置之前,以 t 结构体的形式返回当前随机数生成器的设置。您可以使用上述语法中的任意输入参量组合指定输出参量。

示例

全部折叠

使用默认生成器算法和种子初始化随机数生成器。

rng("default")

显示默认随机数生成器设置。在本例中,随机数生成器使用种子为 0 的梅森旋转算法。

s = rng
s = struct with fields:
     Type: 'twister'
     Seed: 0
    State: [625x1 uint32]

创建一个由 0 到 1 之间均匀分布的随机数组成的 4×4 矩阵。

r = rand(4)
r = 4×4

    0.8147    0.6324    0.9575    0.9572
    0.9058    0.0975    0.9649    0.4854
    0.1270    0.2785    0.1576    0.8003
    0.9134    0.5469    0.9706    0.1419

从 R2023b 开始,您可以从 MATLAB 预设项 窗口设置默认算法和种子。如果您不更改 MATLAB 预设项,则与以前的版本一样,rng 将使用种子为 0 的梅森旋转生成器的出厂值 "twister"

指定随机数生成器设置,以使本示例中的结果具备可重复性。将生成器种子设置为 2,将算法设置为梅森旋转,然后保存生成器设置。

rng(2,"twister")
s = rng
s = struct with fields:
     Type: 'twister'
     Seed: 2
    State: [625x1 uint32]

创建一个由 0 和 1 之间的随机值组成的 1×5 行向量。

x = rand(1,5)
x = 1×5

    0.4360    0.0259    0.5497    0.4353    0.4204

更改生成器种子和算法,并创建一个新的随机行向量。

rng(1,"philox")
xnew = rand(1,5)
xnew = 1×5

    0.5361    0.2319    0.7753    0.2390    0.0036

现在还原原始生成器设置并创建一个随机向量。结果与用初始生成器创建的原始行向量 x 相匹配。

rng(s)
xold = rand(1,5)
xold = 1×5

    0.4360    0.0259    0.5497    0.4353    0.4204

输入参数

全部折叠

随机数种子,指定为小于 2^32 的非负整数或"shuffle"。当您将 seed 指定为 "shuffle" 时,rng 函数根据当前时间初始化生成器种子,在每次调用 rng 后会产生一个不同的随机数序列。

随机数算法,指定为下表中的选项之一。有关生成器算法的详细信息,请参阅创建和控制随机数流

生成器名称生成器关键字
"twister"梅森旋转mt19937ar
"simdTwister"面向 SIMD 的快速梅森旋转算法dsfmt19937
"combRecursive"组合多递归mrg32k3a
"multFibonacci"乘法滞后 Fibonaccimlfg6331_64
"philox"执行 10 轮的 Philox 4×32 生成器philox4x32_10
"threefry"执行 20 轮的 Threefry 4×64 生成器threefry4x64_20

对于 MATLAB 版本 4.0 和 5.0 中使用的旧生成器,请使用以下选项之一。

生成器名称生成器关键字
"v4"MATLAB 4.0 版旧生成器mcg16807
"v5uniform"MATLAB 5.0 版旧式均匀随机数生成器swb2712
"v5normal"MATLAB 5.0 版旧式正态分布随机数生成器shr3cong

随机数生成器设置,指定为具有字段 TypeSeedState 的结构体。

详细信息

全部折叠

随机数生成器的默认设置

  • 您可以在 MATLAB 预设项 窗口中更改随机数生成器的默认算法和种子。在主页选项卡的环境部分,点击 预设项。选择 MATLAB > 常规,然后为默认算法选择不同选项,并在随机数生成预设项中为默认种子选择不同值。 (自 R2023b 起)

    当您第一次启动 MATLAB 会话或调用 rng("default") 时,MATLAB 使用您在 MATLAB 预设项中设置的默认算法和种子初始化随机数生成器。如果您不更改随机数生成预设项,则与以前的版本一样,rng 将使用种子为 0 的梅森旋转生成器的出厂值 "twister"

  • 如果使用并行工作进程(需要 Parallel Computing Toolbox™),rng("default") 会用种子值 0 对 Threefry 4×64 生成器执行 20 轮来初始化。在 MATLAB 预设项窗口中更改默认生成器设置不会影响并行工作进程的默认行为。 (自 R2023a 起)

随机数生成器的可再现性

如果您希望结果在 MATLAB 会话中可重复,请在程序开始时使用 rng("default")rng("default") 使用 MATLAB 预设项中指定的默认算法和种子。但是,此命令无法保证具有不同预设项的不同 MATLAB 会话之间的结果相同。

如果您希望在将来的 MATLAB 版本中或当您的 MATLAB 预设项中的默认算法和种子有更改时,结果仍然保持不变,可在程序开始时使用 rng(seed,generator)rng(generator)。例如,使用 rng("twister") 以使用种子为 0 的梅森旋转生成器。

提示

  • 当您执行并行处理时,为了数据流的独立性,不要使用 rng("shuffle") 在不同工作进程上设置随机数流,因为它根据当前时间设置随机数生成器的种子。当命令同时发送到多个工作进程时(例如在 parfor 作业中),函数 rng 使用相同的种子。要实现工作进程上的独立流,请使用默认行为或考虑使用 RandStream 在每个工作进程上使用唯一子流。

  • 执行并行处理时,MATLAB 客户端和 MATLAB 工作进程上的默认随机数生成器不同。默认情况下,MATLAB 客户端使用种子为 0 的梅森旋转生成器,而 MATLAB 工作进程使用种子为 0 且执行 20 轮的 Threefry 4×64 生成器。在 MATLAB 预设项中更改默认生成器设置只会影响客户端的默认行为,不会影响并行工作进程的默认行为。如果需要在客户端和工作进程上生成相同的随机数流,可以使用 rng 以及相同的生成器算法和种子(或者考虑使用 RandStream 以及相同的生成器算法、种子和正态变换算法)。有关详细信息,请参阅Control Random Number Streams on Workers (Parallel Computing Toolbox)

  • 要将 rng(代替 randrandn 函数)与 "seed""state""twister" 输入结合使用,请参阅更换不推荐的 rand 和 randn 语法

扩展功能

版本历史记录

在 R2011a 中推出

全部展开