Main Content

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

RandStream

随机数流

说明

RandStream 使用指定的伪随机数生成器算法创建随机数流

您可以从一个或多个随机数流生成 MATLAB® 中的伪随机数。生成随机数数组的最简单方法是使用 randrandirandnrandperm 函数。这些函数全部依赖于同一个均匀分布的随机数流,称为全局流。更改全局流可以使用 RandStream,但这不是必需的。如果使用 RandStream 创建一个流,可以使用 RandStream.setGlobalStream 使其成为全局流。但是,rng 函数提供了更简单的接口来创建一个可以满足大多数用例需求的全局流。

您也可以使用 RandStream 创建流,然后使用 randrandirandnrandperm 从这些流中生成随机数。生成的随机数独立于从全局流或其他流中得到的随机数。有关详细信息,请参阅对象函数

创建对象

使用以下语法创建单个随机数流。如果要同时创建多个独立的流,请使用 RandStream.create 函数。

描述

示例

s = RandStream(gentype) 创建一个随机数流,该数流使用 gentype 指定的均匀伪随机数生成器算法。

示例

s = RandStream(gentype,Name,Value) 还使用一个或多个可选的 Name,Value 对组参数来控制流的属性。

输入参数

全部展开

随机数生成器算法,指定为字符向量或字符串标量(用于指定随机数生成器)。MATLAB 提供了几种生成器算法。下表概述了可用的生成器算法的名称和关键属性。一些生成器算法支持多个流和子流来创建相互独立的随机数集。有关详细信息,请参阅创建和控制随机数流

名称生成器多流和子流支持全精度近似周期
'mt19937ar'梅森旋转219937-1
'dsfmt19937'面向 SIMD 的快速梅森旋转算法 219937-1
'mlfg6331_64'乘法滞后 Fibonacci 生成器2124(251 个流,长度为 272
'mrg32k3a'组合多递归生成器2191(263 个流,长度为 2127
'philox4x32_10'执行 10 轮的 Philox 4×32 生成器2193(264 个流,长度为 2129
'threefry4x64_20'执行 20 轮的 Threefry 4×64 生成器2514(2256 个流,长度为 2258
'shr3cong'移位寄存器生成器与线性同余生成器求和264
'swb2712'修正的借位减法生成器21492
'mcg16807'乘法同余生成器231-2
名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: s = RandStream('mt19937ar','Seed',15,'NormalTransform','Polar')

随机数种子,指定为由 'Seed' 和非负整数或 'shuffle' 组成的以逗号分隔的对组。种子指定算法生成随机数的起点。'shuffle' 根据当前时间创建种子。如果指定一个整数,它必须介于 0 到 232 − 1 之间。

如果在 MATLAB 启动时或在运行仿真之前创建流,请将生成器种子指定为初始化步骤。要重现一个流,请每次使用相同的种子。虽然使用多个种子会产生多个随机数序列,但无法保证不同序列在统计上是独立的。如果不同序列在统计上独立很重要,请指定 Substream 属性或使用 RandStream.create 来创建在统计上独立的流。

使用 randn 从随机数流生成正态分布随机数的变换算法,指定为由 'NormalTransform' 和算法名称 'Ziggurat''Polar''Inversion' 之一组成的以逗号分隔的对组。有关详细信息,请参阅创建和控制随机数流

属性

全部展开

随机数流 s 具有可控制其行为的属性。使用 p = s.Property 访问属性,并使用 s.Property = p 修改属性。要保存和还原流 s 的所有属性,您可以分别使用 A = get(s)set(s,A)。此列表描述 RandStream 的属性。

此 属性 为只读。

流使用的随机数生成器算法。有关生成器及其属性的汇总,请参阅生成器算法表。

并非所有生成器算法都支持多个流。对于某些生成器,您可以创建在统计上独立的多个流和子流。

数据类型: char

此 属性 为只读。

用于创建流的随机数种子,以非负整数形式返回。

数据类型: uint32

此 属性 为只读。

创建了当前流的组中的流数目,以正整数形式返回。

数据类型: uint64

此 属性 为只读。

用于创建当前流的流组中的当前流索引,以正整数形式返回。

数据类型: uint64

生成器的当前内部状态,指定为整数向量。状态向量的大小取决于生成器算法。设置此属性时,赋给 s.State 的值必须是以前从 s.State 读取的值。使用 reset 将流恢复为其初始状态(如果以前从 State 属性读取了值)。通过 State 属性保存并还原生成器的内部状态可允许您重现随机数序列。

内部状态确定随机数流 s 产生的随机数序列。每次从单个流中生成随机数时,流中生成器的状态都会转换,以创建在统计上独立且在分布上相同的连续值。

注意

仅还原随机数流的状态或重置流,以从流中重现结果。

数据类型: uint32

流当前设置为的子流的索引。

对于某些生成器类型,您可以从一个随机流创建不同子流。从不同子流生成的值是相互独立的。有关支持子流的生成器,请参阅生成器算法表。

数据类型: double

使用 randn 生成正态分布伪随机值的转换算法。

数据类型: char

s 是否生成对偶伪随机值,指定为逻辑值 true (1) 或 false (0)。对偶值是从 1 中减去默认生成的均匀分布伪随机值。

数据类型: logical

s 是否使用其全精度生成值,指定为逻辑值 true (1) 或 false (0)。如果 FullPrecisionfalse,则某些生成器可以更快地创建伪随机值,但这些值的随机位数更少。

数据类型: logical

对象函数

默认情况下,随机数生成函数(如 rand)使用全局随机数流。要指定不同流,请创建一个 RandStream 对象,并将其作为第一个输入参数进行传递。例如,使用面向 SIMD 的快速梅森旋转创建一个 4×1 随机数向量。

s = RandStream('dsfmt19937');
r = rand(s,4,1);

这些函数接受 RandStream 对象:

rand均匀分布的随机数

支持的语法,其中 sRandStream 对象:

X = rand(s)
X = rand(s,n)
X = rand(s,sz1,...,szN)
X = rand(s,sz)
X = rand(s,__,typename)
X = rand(s,__,'like',p)
有关其他输入参数的详细信息,请参阅 randrandirandn

randi均匀分布的伪随机整数
randn正态分布的随机数
randperm整数的随机排列

支持的语法,其中 sRandStream 对象:

p = randperm(s,n)
p = randperm(s,n,k)
有关其他输入参数的详细信息,请参阅 randperm

RandStream 的其他对象函数有:

RandStream.create创建在统计上独立的随机数流
RandStream.list列出随机数生成器算法
RandStream.getGlobalStream获取当前全局随机数流
RandStream.setGlobalStream设置全局随机数流
reset重置随机数流

示例

全部折叠

使用面向 SIMD 的快速梅森旋转创建一个随机数流。

s = RandStream('dsfmt19937')
s = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Ziggurat

使用该流生成五个随机数。

rand(s,1,5)
ans = 1×5

    0.0306    0.2131    0.2990    0.3811    0.8635

基于当前时间使用生成器种子创建一个随机数流。通常不需要在每个 MATLAB® 会话中多次执行该操作,因为它可能会影响 MATLAB 生成的随机数的统计属性。

s = RandStream('mt19937ar','Seed','shuffle');

使用该流创建一个 3×3 随机值矩阵,其中的随机值在 0 和 1 之间均匀分布。

X1 = rand(s,3)
X1 = 3×3

    0.6848    0.9962    0.8202
    0.4550    0.6458    0.8120
    0.7448    0.0370    0.7870

从该流创建另外五个随机数。

X2 = rand(s,1,5)
X2 = 1×5

    0.7246    0.1234    0.1981    0.4545    0.4787

创建一个由单精度数组成的 2×3 矩阵。

p = single([0.1 -3 2.5; 1.2 -3.4 6]);

创建种子为零的一个随机数流。

s = RandStream('mcg16807','Seed',0);

使用该流生成一个与 p 具有相同大小和数据类型的由随机数组成的数组。

z = rand(s,size(p),'like',p)
z = 2x3 single matrix

    0.2190    0.6789    0.9347
    0.0470    0.6793    0.3835

class(z)
ans = 
'single'

创建种子为零的一个随机数流。

s = RandStream('mcg16807','Seed',0);

从该流生成五个随机数。每次您从该流生成一个数字时,生成器算法都会转换内部状态,以便下一个生成的数字与前一个数字独立同分布。

u1 = rand(s,1,5)
u1 = 1×5

    0.2190    0.0470    0.6789    0.6793    0.9347

保存生成器的当前状态。生成另外五个随机数。

savedState = s.State;
u2 = rand(s,1,5)
u2 = 1×5

    0.3835    0.5194    0.8310    0.0346    0.0535

要重现五个随机数的最后结果,请将生成器状态还原到保存的状态。

s.State = savedState;
u3 = rand(s,1,5)
u3 = 1×5

    0.3835    0.5194    0.8310    0.0346    0.0535

只读取和写入生成器状态以从该流重现特定的结果。

创建一个种子为 3 的随机数流。使用该流生成八个随机数。

stream = RandStream('dsfmt19937','Seed',3);
z = rand(stream,1,8)
z = 1×8

    0.2550    0.8753    0.0908    0.1143    0.3617    0.8210    0.8444    0.6189

用等于 3 的种子将随机数流重置为其初始状态。重现生成的八个随机数。

reset(stream,3);
z = rand(stream,1,8)
z = 1×8

    0.2550    0.8753    0.0908    0.1143    0.3617    0.8210    0.8444    0.6189

重置流的种子会使其与其他流间的独立性失效。仅在需要从该流中重现结果时重置流。

创建两个随机数流。使用 RandStream.setGlobalStream 将第一个流设置为全局流。

globalStream = RandStream('mlfg6331_64','NormalTransform','Polar')
globalStream = 
mlfg6331_64 random stream
             Seed: 0
  NormalTransform: Polar

RandStream.setGlobalStream(globalStream);

要显示当前全局流,请使用 RandStream.getGlobalStream

RandStream.getGlobalStream
ans = 
mlfg6331_64 random stream (current global stream)
             Seed: 0
  NormalTransform: Polar

创建第二个流 myStream,它独立于您创建的新全局流。

myStream = RandStream('dsfmt19937','NormalTransform','Inversion')
myStream = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Inversion

从全局流中生成三个随机数。从您创建的局部流 myStream 中生成另外三个随机数。

randn(1,3)
ans = 1×3

    0.8715    1.0588   -0.6956

randn(myStream,1,3)
ans = 1×3

   -1.8723   -0.7956   -0.5273

当您在不使用 myStream 的情况下调用函数 randrandnrandi 时,它们从全局流中提取数据,不会影响使用 myStream 时调用这些函数的结果。

对于某些生成器类型,您可以从一个随机流创建不同子流。从不同子流生成的值是相互独立的。

例如,使用组合的多重递归生成器创建一个随机数流。

s = RandStream('mrg32k3a');

要将一个流重新定位到特定子流,请设置其 Substream 属性。例如,在循环中生成随机数。在循环的每次迭代之前,将随机数流定位到一个不同子流的开头。生成 3 组相互独立的 5 个随机数。

for i = 1:3
    s.Substream = i;
    z = rand(s,1,5)
end
z = 1×5

    0.7270    0.4522    0.9387    0.2360    0.0277

z = 1×5

    0.5582    0.8527    0.7733    0.0633    0.2788

z = 1×5

    0.1666    0.2924    0.7728    0.8391    0.5107

要重现第二组的 5 个随机数,请将流重新定位到对应的子流。

s.Substream = 2;
z = rand(s,1,5)
z = 1×5

    0.5582    0.8527    0.7733    0.0633    0.2788

详细信息

全部展开

扩展功能

版本历史记录

在 R2008b 中推出