本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

RandStream

随机数流

构造函数

RandStream

说明

MATLAB® 中的伪随机数来自一个或多个随机数流。生成随机数数组的最简单方法是使用 randrandnrandi。这些函数全部都依赖于同一均匀随机数流,称为全局流。您可以创建与全局流分开使用的其他流,使用它们的 randrandirandn 方法生成随机数数组。您也可以创建随机数流并将其用作全局流。

要创建单个随机数流,请使用 RandStream 构造函数。要创建多个独立的随机数流,请使用 RandStream.createrng 函数提供一个用于新建全局流的简单接口。

stream = RandStream.getGlobalStream 返回全局随机数流,即 randrandirandn 函数当前使用的数流。

prevstream = RandStream.setGlobalStream(stream) 将随机数流 stream 指定为 randrandirandn 函数要使用的新全局流,并返回上一全局流。

随机数流 s 具有可控制其行为的属性。使用 p = s.Propertys.Property = p 访问或指定给属性。下表列出了定义的属性:

属性

属性说明
Type(只读)流使用的生成器算法。可能的生成器列表由 RandStream.list 提供。
Seed(只读)用于创建流的种子值。
NumStreams(只读)创建了当前流的组中的流数目。
StreamIndex(只读)用于创建当前流的流组中的当前流索引。
State

生成器的内部状态。不应依赖于该属性的格式。赋给 S.State 的值必须是以前从 S.State 读取的值。使用 reset 将流恢复为可预测状态(如果以前从 State 属性读取了值)。

随机数流 s 生成的随机数序列由其随机数生成器的内部状态决定。通过 State 保存并还原生成器的内部状态可允许您重现随机数序列。

Substream流当前设置为的子流的索引。默认值为 1。并非所有生成器类型都支持多个子流;乘法滞后 Fibonacci 生成器 (mlfg6331_64) 以及组合多递归生成器 (mrg32k3a) 支持子流。
NormalTransformrandn(s, ...) 生成正态伪随机值时所用的转换算法。可能的值包括 'Ziggurat''Polar''Inversion'
Antithetic逻辑值指示 S 是否生成对偶伪随机值,即从 1 减去的普通值。默认为 false。
FullPrecision逻辑值,用于指示 S 是否使用其完全精度来生成值。如果 FullPrecision 为 false,则某些生成器可以更快地创建伪随机值,但这些值的随机位数更少。默认为 true。

方法

方法说明
RandStream创建随机数流。
RandStream.create创建多个独立的随机数流。
get获取随机流对象的属性。
list列出可用的随机数生成器算法。
set设置随机流属性。
RandStream.getGlobalStream获取全局随机数流。
RandStream.setGlobalStream设置全局随机数流。
reset将流重置为其初始内部状态
rand均匀分布的伪随机数
randn标准正态分布的伪随机数
randi均匀离散分布的伪随机数
randperm随机置换一组值

示例

示例 1

创建单个流并将其指定为当前全局流:

s = RandStream('mt19937ar','Seed',1);
RandStream.setGlobalStream(s);

示例 2

创建三个独立流:

[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])

示例 3

基于这三个独立流仅创建一个流,并将其指定为当前的全局流:

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

示例 4

将作为 randrandirandn 基础的全局随机数流重置回其初始状态,以重现以前的结果:

stream = RandStream.getGlobalStream;
reset(stream);

示例 5

保存并还原当前全局流的状态以重现 rand 的输出:

stream = RandStream.getGlobalStream;
savedState = stream.State;
u1 = rand(1,5)
u1 =
    0.8147    0.9058    0.1270    0.9134    0.6324

stream.State = savedState;
u2 = rand(1,5)
u2 =
    0.8147    0.9058    0.1270    0.9134    0.6324
u2 包含的值与 u1 完全相同。

示例 6

将全局随机数流重置为其初始设置。这导致 randrandirandn 重新开始,好像在新的 MATLAB 会话中一样:

s = RandStream('mt19937ar','Seed',0);
RandStream.setGlobalStream(s);

示例 7

使用种子基于当前时间重新初始化全局随机数流。这导致 randrandirandn 在不同 MATLAB 会话中返回不同值。通常不需要在每个 MATLAB 会话中多次执行该操作,因为它可能会影响 MATLAB 生成的随机数的统计属性:

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

示例 8

更改 randn 用于基于均匀值创建正常伪随机值的转换算法。这并不会更换或重置全局流。

stream = RandStream.getGlobalStream;
stream.NormalTransform = 'inversion'

另请参阅

| | |