使用 RandStream
管理全局流
rand
、randn
、randi
和 randperm
从称为全局流的基础随机数流获取随机数。全局流是一个 RandStream
对象。控制全局流的简单方法是使用 rng
函数。为了进行更全面的控制,RandStream
类使您能够从全局流创建一个单独的流,获得全局流的句柄,并控制随机数生成。
使用 rng
将随机数生成器设置为默认的种子 (0
) 和算法(梅森旋转)。保存生成器设置。
rng('default')
s = rng
s = struct with fields:
Type: 'twister'
Seed: 0
State: [625x1 uint32]
创建一个由 0 和 1 之间的均匀分布随机值组成的 1×6 行向量。
x = rand(1,6)
x = 1×6
0.8147 0.9058 0.1270 0.9134 0.6324 0.0975
使用 RandStream.getGlobalStream
返回全局流的句柄,即 rand
从中生成随机数的当前全局流。如果您使用 RandStream.getGlobalStream
获取全局流的句柄,您可以看到您使用 rng
对全局流所做的更改。
globalStream = RandStream.getGlobalStream
globalStream = mt19937ar random stream (current global stream) Seed: 0 NormalTransform: Ziggurat
更改生成器种子和算法,并创建一个新的随机行向量。显示 rand
从中生成随机数的当前全局流。
rng(1,'philox')
xnew = rand(1,6)
xnew = 1×6
0.5361 0.2319 0.7753 0.2390 0.0036 0.5262
globalStream = RandStream.getGlobalStream
globalStream = philox4x32_10 random stream (current global stream) Seed: 1 NormalTransform: Inversion
接下来,还原原始生成器设置并创建一个随机向量。结果与用默认生成器创建的原始行向量 x
相匹配。
rng(s) xold = rand(1,6)
xold = 1×6
0.8147 0.9058 0.1270 0.9134 0.6324 0.0975
默认情况下,随机数生成函数(如 rand
)使用全局随机数流。要指定不同流,请创建另一个 RandStream
对象。将其作为第一个输入参数传递给 rand
。例如,使用面向 SIMD 的快速梅森旋转创建一个 1×6 随机数向量。
myStream = RandStream('dsfmt19937')
myStream = dsfmt19937 random stream Seed: 0 NormalTransform: Ziggurat
r = rand(myStream,1,6)
r = 1×6
0.0306 0.2131 0.2990 0.3811 0.8635 0.1334
当您以 myStream
作为第一个输入参数调用 rand
函数时,它从 myStream
中获取数字,并且不影响全局流的结果。
如果要将 myStream
设置为全局流,可以使用 RandStream.setGlobalStream
对象函数。
RandStream.setGlobalStream(myStream) globalStream = RandStream.getGlobalStream
globalStream = dsfmt19937 random stream (current global stream) Seed: 0 NormalTransform: Ziggurat
在许多情况下,控制全局流只需使用 rng
函数,但 RandStream
类允许控制一些高类功能,如选择用于正态随机值的算法。
例如,创建一个 RandStream
对象,并指定转换算法,以便在使用 randn
时生成正态分布的伪随机值。使用 Polar
转换算法而不是默认的 Ziggurat
转换算法生成正态分布的伪随机值。
myStream = RandStream('mt19937ar','NormalTransform','Polar')
myStream = mt19937ar random stream Seed: 0 NormalTransform: Polar
将 myStream
设置为全局流。从全局流中创建 6 个正态分布的随机数。
RandStream.setGlobalStream(myStream) randn(1,6)
ans = 1×6
0.2543 -0.7733 -1.7416 0.3686 0.5965 -0.0191