主要内容

RandStream

随机数流

描述

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

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

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

创建

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

描述

例子

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

例子

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

输入参数

全部展开

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

名字 发电机 多流和子流支持万博1manbetx 全精度近似周期
“mt19937ar” Mersenne Twister(在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” 带有20发子弹的三联4x64发电机 是的 2514(2256长度为2的流258
“shr3cong” 移位寄存器发生器与线性同余发生器求和 没有 264
“swb2712” 修改减法借用生成器 没有 21492
“mcg16807” 乘法同余生成器 没有 2312
名称-值参数

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

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

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

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

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

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

属性

全部展开

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

该属性是只读的。

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

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

数据类型:字符

该属性是只读的。

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

数据类型:uint32

该属性是只读的。

创建当前流的组中的流数,以正整数形式返回。

数据类型:uint64

该属性是只读的。

创建该流的流组中当前流的索引,以正整数形式返回。

数据类型:uint64

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

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

请注意

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

数据类型:uint32

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

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

数据类型:

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

数据类型:字符

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

数据类型:逻辑

是否年代使用其全部精度(指定为逻辑)生成值真正的1)或0)。有些生成器可以更快地创建伪随机值,但使用更少的随机位FullPrecision

数据类型:逻辑

对象的功能

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

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

这些函数接受RandStream对象:

兰德 均匀分布随机数

万博1manbetx支持的语法,其中年代是一个RandStream对象:

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

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

万博1manbetx支持的语法,其中年代是一个RandStream对象:

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

的其他对象函数RandStream是:

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

例子

全部折叠

使用面向simd的快速梅森捻线器创建随机数流。

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

使用流生成五个随机数。

兰特(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.7292 0.3911 0.1948 0.2464 0.5257 0.1145 0.6898 0.1627 0.2157

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

X2 = rand(s,1,5)
X2 =1×50.8624 0.7559 0.1614 0.8363 0.7161

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

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

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

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

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

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

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

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

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

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

保存发电机的当前状态。生成另外五个随机数。

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

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

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

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

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

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

将随机数流重置为其初始状态,seed等于3。再现生成的8个随机数。

重置(流,3);Z = rand(stream,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随机流Seed: 0 NormalTransform: Polar
RandStream.setGlobalStream (globalStream);

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

RandStream.getGlobalStream
ans = mlfg6331_64随机流(当前全局流)Seed: 0 NormalTransform: Polar

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

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

从全局流生成三个随机数。从本地流生成另外三个随机数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中引入