Main Content

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

RandStream.create

创建在统计上独立的随机数流

说明

s = RandStream.create(gentype) 创建一个随机流,该流使用 gentype 指定的均匀伪随机数生成器算法。RandStream.listgentype 返回所有的可能值,或参阅创建和控制随机数流了解有关生成器算法的详细信息。当您需要创建单个流时,RandStream 函数是更简洁的方法。

示例

[s1,s2,...] = RandStream.create(gentype,'NumStreams',n) 创建 n 个随机数流。这些流在伪随机意义上是独立的。这些流不一定独立于在其他时间创建的流。

注意

并非所有生成器类型都支持多个流。使用乘法滞后 Fibonacci 生成器 ('mlfg6331_64') 或组合多递归生成器 ('mrg32k3a') 创建多个流。

示例

[___] = RandStream.create(gentype,Name,Value) 使用一个或多个 Name,Value 对组控制流的创建。

示例

全部折叠

创建三个独立流。从每个流中生成随机数。检查它们之间的相关性。不同流之间的相关性并非恰好为 0,因为它们是从分布采样计算得出的。

[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3);
r1 = rand(s1,100000,1); 
r2 = rand(s2,100000,1); 
r3 = rand(s3,100000,1);
corrcoef([r1,r2,r3])
ans = 3×3

    1.0000    0.0016   -0.0019
    0.0016    1.0000   -0.0012
   -0.0019   -0.0012    1.0000

您还可以基于三个独立流创建一个流,并将其指定为全局流。

s2 = RandStream.create('mrg32k3a','NumStreams',3,'StreamIndices',2);
RandStream.setGlobalStream(s2);

从全局流中生成随机数。

r = rand(100000,1);

使用 RandStream.create 方法创建三个相互独立的流对一维随机游走进行仿真。

[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3);

从第一个流生成随机游走。首先,将其设置为全局流。使用第一个流生成 5000 个服从标准正态分布的随机步。选择 0 作为起始位置,并使用 cumsum 计算随机步的累积和。绘制生成的随机游走。

RandStream.setGlobalStream(s1)
dy1 = randn(5000,1);
y1 = cumsum([0; dy1]);
plot(y1)

Figure contains an axes object. The axes object contains an object of type line.

使用第二个和第三个流重复上述过程。将结果绘制在同一坐标区上。

hold on;
dy2 = randn(s2,5000,1);
y2 = cumsum([0; dy2]);
plot(y2)
dy3 = randn(s3,5000,1);
y3 = cumsum([0; dy3]);
plot(y3)
hold off

Figure contains an axes object. The axes object contains 3 objects of type line.

计算各流之间的相关性。不同流之间的相关性并非恰好为 0,因为它们是从分布采样计算得出的。

C = corrcoef([dy1 dy2 dy3])
C = 3×3

    1.0000   -0.0363    0.0155
   -0.0363    1.0000   -0.0012
    0.0155   -0.0012    1.0000

输入参数

全部折叠

随机数生成器算法,指定为字符向量或字符串标量(用于指定随机数生成器)。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 引起来。

示例: RandStream.create('mrg32k3a','NumStreams',3,'StreamIndices',2)

要创建的独立流的数量,指定为由 'NumStreams' 和正整数组成的以逗号分隔的对组。

流索引,指定为由 'StreamIndices' 和正整数或正整数向量组成的以逗号分隔的对组。指定此参数可对用于创建当前流的流组中的当前流进行索引。默认值是 1:N,其中 N'NumStreams' 的值。

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

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

使用 randn 从随机数流生成正态分布随机数的变换算法,指定为由 'NormalTransform' 和算法名称 'Ziggurat''Polar''Inversion' 之一组成的以逗号分隔的对组。

用于返回元胞数组的选项,指定为以逗号分隔的 'CellOutput' 和逻辑值 false (0) 或 true (1) 对组。如果将 'CellOutput' 指定为 true,则 RandStream.create 以元胞数组元素形式返回流对象。

提示

通常,您会在一次传递中或在 MATLAB 会话开始时调用 RandStream.create 一次以创建多个独立流。例如,您可以使用 [s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3) 创建三个独立流。

您也可以通过分别调用 RandStream.create 创建每个流,但您必须为 gentype'NumStreams''Seed''StreamIndices' 指定相应值以确保其独立性:

  • gentype'NumStreams''Seed' 分别指定相同的值。

  • 每次为 'StreamIndices' 指定不同值。所有值都应介于 1'NumStreams' 的值之间。

例如,使用 s1 = RandStream.create('mrg32k3a','NumStreams',5,'Seed',0,'StreamIndices',1)s2 = RandStream.create('mrg32k3a','NumStreams',5,'Seed',0,'StreamIndices',2) 创建两个独立的流。

版本历史记录

在 R2008b 中推出