随机数流
随机数流是由确定性算法生成的一个伪随机数序列的源。伪随机序列是随机数理论序列的逼近,其分布满足独立同分布 (i.i.d.) 条件,但实际上,确定性算法无法生成 i.i.d 序列。算法生成的序列可通过分布和相关性的统计检验,表明它们是很好的逼近。
法一
RandStream.create
创建在统计上独立的随机数流
语法
s = RandStream.create(gentype)
[s1,s2,...] = RandStream.create(gentype,'NumStreams',n)
[___] = RandStream.create(gentype,Name,Value)
说明
s
= RandStream.create(gentype)
创建一个随机流,该流使用 gentype
指定的均匀伪随机数生成器算法。RandStream.list 为 gentype
返回所有的可能值,或参阅创建和控制随机数流了解有关生成器算法的详细信息。当您需要创建单个流时,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
法二
您可以从一个随机流创建不同子流。从不同子流生成的值是相互独立的。
例如,使用组合的多重递归生成器创建一个随机数流。
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