主要内容

RandStream

随机数流

描述

RandStream创建一个随机数流使用指定的伪随机数发生器算法。

可以在MATLAB中生成伪随机数®从一个或多个随机数流。生成随机数数组的最简单方法是使用兰德兰迪randn,randperm功能。这些函数都依赖于相同的均匀分布随机数流,称为全球流.改变全球潮流可能涉及RandStream,但也不必如此。如果您使用RandStream,你可以使用RandStream.setGlobalStream让它成为全球流。然而,rng函数提供了一个更简单的接口来创建对大多数用例来说足够的全局流。

你也可以使用RandStream创建流,然后使用兰德兰迪randn,或randperm从这些流中生成随机数。生成的随机数与从全局流或其他流中抽取的随机数是分开的。详细信息请参见对象的功能

创建

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

描述

例子

年代= RandStream (gentype属性指定的统一伪随机数生成器算法创建随机数流gentype

例子

年代= RandStream (gentype名称,值还使用一个或多个可选控件流的属性名称,值对参数。

输入参数

全部展开

随机数生成器算法,指定为字符向量或字符串标量命名随机数生成器。MATLAB提供了几种生成器算法。下表总结了可用生成器算法的名称和关键属性。一些生成器算法支持多个流和子流来创建相互独立的随机数金宝app集。有关更多信息,请参见创建和控制随机数流

的名字 发电机 多流和子流支持金宝app 完全精确的近似周期
“mt19937ar” 梅森扭扭器(MATLAB启动时默认流使用) 没有 219937-1
“dsfmt19937” simd导向快速梅森扭扭机 没有 219937-1
“mlfg6331_64” 乘法滞后斐波那契生成器 是的 2124(251长度为2的流72
“mrg32k3a” 组合多个递归生成器 是的 2191(263长度为2的流127
“philox4x32_10” Philox 4x32发电机,10发子弹 是的 2193(264长度为2的流129
“threefry4x64_20” 三炸4x64发电机,20发子弹 是的 2514(2256长度为2的流258
“shr3cong” 移位寄存器发生器和线性同余发生器 没有 264
“swb2712” 修改减去借用发电机 没有 21492
“mcg16807” 乘法同余发生器 没有 231-2
名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字在报价。

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

随机数种子,指定为逗号分隔的对,由“种子”和一个非负整数或者“洗牌”.种子指定算法生成随机数的起始点。“洗牌”基于当前时间创建种子。如果指定一个整数,它必须在0到2之间32−1。

在MATLAB启动时或运行模拟之前创建流时,将生成器种子指定为初始化步骤。要复制一条溪流,每次都要使用相同的种子。虽然使用多个种子会创建多个随机数序列,但不能保证不同的序列在统计上是独立的。在这很重要的情况下,指定Substream财产或使用RandStream.create创建统计上独立的流。

转换算法从随机数流中生成正态分布随机数使用randn,指定为逗号分隔的对,由“NormalTransform”其中一个算法名“神”“极地”,或“反转”.有关更多信息,请参见创建和控制随机数流

属性

全部展开

随机数流年代具有控制其行为的属性。使用以下命令访问属性p = s。然后用s.Property = p.保存和恢复流的所有属性年代,你可以使用A = get(s)而且集(,),分别。的属性RandStream

此属性是只读的。

随机数发生器采用的流算法。参见发生器算法获取生成器及其属性的摘要。

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

数据类型:字符

此属性是只读的。

用于创建流的随机数种子,作为非负整数返回。

数据类型:uint32

此属性是只读的。

组中创建当前流的流数,返回为正整数。

数据类型:uint64

此属性是只读的。

当前流在与其一起创建的流组中的索引,返回为正整数。

数据类型:uint64

生成器的当前内部状态,指定为整数向量。状态向量的大小取决于生成器算法。设置此属性时,所赋给的值s.State必须是读取的值s.State之前。使用重置方法将流返回到其初始状态,而无需先前从状态财产。控件保存和恢复生成器的内部状态状态属性允许您重新生成随机数序列。

内部状态决定了随机数流产生的随机数序列年代.每次从单个流生成随机数时,流中的生成器的状态将被转换为创建统计上独立且相同分布的连续值。

请注意

仅恢复随机数流的状态,或重置流,以从流中再现结果。

数据类型:uint32

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

对于某些生成器类型,您可以从随机流创建不同的子流。不同子流生成的值是相互独立的。参见发生器算法用于支持子流的生成器。金宝app

数据类型:

利用变换算法生成正态分布伪随机值randn

数据类型:字符

是否年代生成对立的伪随机值,指定为逻辑值真正的1)或0).对立值是默认生成的伪随机值,均匀分布减去1。

数据类型:逻辑

是否年代使用指定为逻辑的完整精度生成值真正的1)或0).一些生成器可以更快地创建伪随机值,但随机位更少,如果FullPrecision

数据类型:逻辑

对象的功能

缺省情况下,有随机数生成函数,如兰德,使用全局随机数流。要指定不同的流,请创建RandStream对象并将其作为第一个输入参数传递。例如,使用SIMD-Oriented Fast Mersenne Twister创建一个4乘1的随机数向量。

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

这些函数接受RandStream对象:

兰德 均匀分布随机数

金宝app支持的语法年代是一个RandStream对象:

X =兰德(s) X =兰德(s、n) X =兰德(s sz1…,szN) X =兰德(年代,sz) X =兰德(年代,__,typename) X =兰德(年代,__,‘喜欢’,p)
有关其他输入参数的详细信息,请参见兰德兰迪,randn

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

金宝app支持的语法年代是一个RandStream对象:

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

的其他对象函数RandStream是:

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

例子

全部折叠

使用SIMD-Oriented快速梅森扭扭器创建一个随机数流。

s = RandStream(“dsfmt19937”
s = dsfmt19937随机流种子:0 NormalTransform: Ziggurat

使用流生成5个随机数。

兰特(s, 1、5)
ans =1×50.0306 0.2131 0.2990 0.3811 0.8635

使用基于当前时间的生成器种子创建随机数流。在每个MATLAB会话中这样做一次以上通常是不可取的,因为它可能会影响MATLAB产生的随机数的统计特性。

s = RandStream(“mt19937ar”“种子”“洗牌”);

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

X1 = rand(s,3)
X1 =3×30.3380 0.3370 0.8763 0.3080 0.5408 0.3778 0.1239 0.0569 0.6932

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

X2 = rand(s,1,5)
X2 =1×50.3879 0.3919 0.7438 0.2204 0.8519

创建一个2 × 3的单精度数字矩阵。

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

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

s = RandStream(“mcg16807”“种子”, 0);

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

Z = rand(s,size(p),“喜欢”, p)
z =2x3单矩阵0.2190 0.6789 0.9347 0.0470 0.6793 0.3835
类(z)
Ans =“单身”

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

s = RandStream(“mcg16807”“种子”, 0);

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

U1 = rand(s,1,5)
u1 =1×50.2190 0.0470 0.6789 0.6793 0.9347

保存发电机的当前状态。再生成5个随机数。

savedState = s.State;U2 = rand(s,1,5)
u2 =1×50.3835 0.5194 0.8310 0.0346 0.0535

若要重现五个随机数的最后一个结果,请将生成器状态恢复到已保存的状态。

s.State = savedState;U3 = rand(s,1,5)
u3 =1×50.3835 0.5194 0.8310 0.0346 0.0535

仅读取和写入生成器状态以从流中再现特定的结果。

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

流= RandStream(“dsfmt19937”“种子”3);Z = rand(流,1,8)
z =1×80.2550 0.8753 0.0908 0.1143 0.3617 0.8210 0.8444 0.6189

将随机数流重置为种子值为3的初始状态。复制生成的8个随机数。

重置(流,3);Z = rand(流,1,8)
z =1×80.2550 0.8753 0.0908 0.1143 0.3617 0.8210 0.8444 0.6189

重置流的种子会使其与其他流的独立性失效。仅重置流以重新生成流的结果。

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

globalStream = RandStream(“mlfg6331_64”“NormalTransform”“极地”
globalStream = mlfg6331_64随机流种子:0 NormalTransform: Polar
RandStream.setGlobalStream (globalStream);

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

RandStream.getGlobalStream
ans = mlfg6331_64随机流(当前全局流)种子:0 NormalTransform:极性

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

myStream = RandStream(“dsfmt19937”“NormalTransform”“反转”
myStream = dsfmt19937随机流

从全局流中生成三个随机数。从本地流生成另外三个随机数myStream是你创造的。

randn(1、3)
ans =1×30.8715 1.0588 -0.6956
randn (myStream 1 3)
ans =1×3-1.8723 -0.7956 -0.5273

当你调用函数时兰德randn,兰迪没有myStream,它们从全局流中抽取,不会影响调用它们的结果myStream

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

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

s = RandStream(“mrg32k3a”);

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

I = 1:3 s。Substream= i; z = rand(s,1,5)结束
z =1×50.7270 0.4522 0.9387 0.2360 0.0277
z =1×50.5582 0.8527 0.7733 0.0633 0.2788
z =1×50.1666 0.2924 0.7728 0.8391 0.5107

为了重现第二组5个随机数,将流重新定位到相应的子流。

s.Substream = 2;Z = rand(s,1,5)
z =1×50.5582 0.8527 0.7733 0.0633 0.2788

更多关于

全部展开

扩展功能

版本历史

在R2008b中引入