的RandStream
类允许您创建一个随机数流。这很有用,原因如下:
您可以在不影响全局流状态的情况下生成随机值。
你可以在模拟中分离随机性的来源。
您可以使用配置与MATLAB不同的生成器®软件在启动时使用。
与一个RandStream
对象,您可以创建自己的流,设置可写属性,并使用流生成随机数。你可以控制你创建的流,就像你控制全局流一样。您甚至可以用您创建的流替换全局流。
要创建流,请使用RandStream
函数。
myStream = RandStream(“mlfg6331_64”);兰特(myStream 1 5)
Ans = 0.6986 0.7413 0.4239 0.6914 0.7255
随机流myStream
独立于全局流进行操作。如果你致电兰德
,randn
,兰迪
,randperm
功能与myStream
作为第一个参数,它们从您创建的流中进行绘制。如果你打电话兰德
,randn
,兰迪
,randperm
没有myStream
在美国,他们从全球潮流中汲取资源。
你可以做出myStream
全局流使用RandStream.setGlobalStream
方法。
RandStream.setGlobalStream RandStream.getGlobalStream (myStream)
ans = mlfg6331_64随机流(当前全局流)种子:0 NormalTransform: Ziggurat
RandStream.getGlobalStream==myStream
Ans = 1
您可以使用子流来获得统计上独立于流的不同结果。与种子不同,种子沿着随机数序列的位置并不完全知道,子流之间的间隔是已知的,因此可以消除任何重叠的可能性。简而言之,子流是一种更可控的方式,可以完成种子传统上所做的许多相同的事情。子流也是比并行流更轻量级的解决方案。
子流提供了一种快速而简单的方法来确保您在不同的时间从相同的代码获得不同的结果。使用Substream
的属性RandStream
对象,使用支持子流的生成器创建流。金宝app有关支持子流及其属性的生成器算法的列表,请参阅下一节中的表格。金宝app例如,在循环中生成几个随机数。
myStream = RandStream(“mlfg6331_64”);RandStream.setGlobalStream (myStream)为i = 1:5 myStream。Substream = i;Z = rand(1,i)结束
Z = 0.6986 Z = 0.9230 0.2489 Z = 0.0261 0.2530 0.0737 Z = 0.3220 0.7405 0.1983 0.1052 Z = 0.2067 0.2417 0.9777 0.5970 0.4187
在另一个循环中,您可以生成独立于第一个5个迭代集的随机值。
为i = 6:10 myStream。Substream = i;Z = rand(1,11-i)结束
Z = 0.2650 0.8229 0.2479 0.0247 0.4581 Z = 0.3963 0.7445 0.7734 0.9113 Z = 0.2758 0.3662 0.7979 Z = 0.6814 0.5150 Z = 0.5247
子流在串行计算中很有用。子流可以通过返回流中的特定检查点来重新创建全部或部分模拟。例如,您可以返回到循环中的第6个子流。结果包含与上面第6个输出相同的值。
myStream。Substream=6; z = rand(1,5)
Z = 0.2650 0.8229 0.2479 0.0247 0.4581
MATLAB提供了几个生成器算法选项。该表总结了可用生成器算法的关键属性以及用于创建它们的关键字。要返回所有可用生成器算法的列表,请使用RandStream.list
方法。
关键字 | 发电机 | 多流和子流支持金宝app | 完全精确的近似周期 |
---|---|---|---|
mt19937ar |
梅森扭扭器(MATLAB启动时默认流使用) | 没有 | 219937-1 |
dsfmt19937 |
simd导向的快速梅森旋扭机 | 没有 | 219937-1 |
mcg16807 |
乘法同余发生器 | 没有 | 231-2 |
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
,shr3cong
,swb2712
提供与MATLAB早期版本的向后兼容性。mt19937ar
而且dsfmt19937
主要是为顺序应用程序设计的。其余生成器提供了对并行随机数生成的显式支持。金宝app
根据应用程序的不同,有些生成器可能更快,或者返回的值更精确。所有伪随机数生成器都基于确定性算法,并且所有生成器都通过了足够特定的随机性统计测试。检查蒙特卡罗模拟结果的一种方法是使用两个或多个不同的生成器算法重新运行模拟,MATLAB中生成器的选择为您提供了这样做的方法。虽然使用不同的生成器时,结果的差异不太可能超过蒙特卡罗抽样误差,但在文献中有这样的例子,这种验证在特定的生成器算法中发现了缺陷。(见[13]举个例子。)
mt19937ar
梅森龙卷风,如描述[11],有周期
每个U(0,1)值是使用两个32位整数创建的。可能的值是的倍数
该生成器不支持多流或多子流。金宝app的randn
默认使用的算法mt19937ar
流是金字巨人算法[7],但与mt19937ar
发电机。
请注意
该生成器与兰德
函数开始于MATLAB版本7,由兰特(捻线机,年代)
.
dsfmt19937
双精密simd导向快速梅森扭扭机,如描述[12],是梅森Twister算法的一个更快的实现。周期是 可能的值是的倍数 在(0,1)的区间内。生成器生成[1,2)的双精度值,这些值被转换为U(0,1)值。此生成器不支持多流或子流。金宝app
mcg16807
32位乘法同余发生器,如中所述[14],有乘数
,模
.这个发生器的周期是
并且不支持多流或子流。金宝app每个U(0,1)值都是使用生成器中的一个32位整数创建的;可能的值都是的倍数
严格在区间(0,1)内,对于mcg16807
的默认算法randn
极坐标算法(描述在[1]).
请注意
该生成器与MATLAB版本4中开始使用的生成器相同兰德
而且randn
功能,使用激活兰特(种子,年代)
或randn(种子,年代)
.
mlfg6331_64
64位乘法滞后斐波那契生成器,如中所述[10],有滞后
,
.这个生成器类似于在SPRNG包中实现的MLFG。它的周期大约是
.它支持金宝app到
并行流,通过参数化和
每个子流的长度
.每个U(0,1)值都是使用生成器中的一个64位整数创建的;可能的值都是的倍数
严格在(0,1)区间内randn
默认使用的算法mlfg6331_64
流是金字巨人算法[7],但与mlfg6331_64
发电机。
mrg32k3a
32位组合的多个递归生成器,如中所述[2].这个生成器类似于在c语言的RngStreams包中实现的CMRG
并支持到金宝app
并行流通过序列分裂,每个长度
.它还支持金宝app
子流,每个子流的长度
.每个U(0,1)值是使用生成器中的两个32位整数创建的;可能的值是的倍数
严格在(0,1)区间内randn
默认使用的算法mrg32k3a
流是金字巨人算法[7],但与mrg32k3a
发电机。
philox4x32_10
4 × 32发电机,有10发子弹[15].该生成器使用Feistel网络和整数乘法。该生成器是专门为高并行系统(如gpu)的高性能而设计的。它的周期是2193(264长度为2的流129).
threefry4x64_20
20发子弹的4x64发电机[15].该生成器是对来自Skein哈希函数的Threefish分组密码的非密码学改编。它的周期是2514(2256长度为2的流258).
shr3cong
Marsaglia的SHR3移位寄存器发生器与带乘法器的线性同余发生器相加
,加数
,模量
.SHR3是一个3移位寄存器发生器,定义为
,在那里
是恒等算子,
是左移运算符,和R是右移位运算符。组合生成器(SHR3部分在[7])的周期约为
.此生成器不支持多流或子流。金宝app每个U(0,1)值是使用生成器中的一个32位整数创建的;可能的值都是的倍数
严格在(0,1)区间内randn
默认使用的算法shr3cong
流是ziggurat算法的早期形式[9],但与shr3cong
发电机。该生成器与randn
函数开始在MATLAB版本5,激活使用randn(状态,年代)
.
swb2712
修改的带借减法生成器,如中所述[8].该生成器类似于延迟27和12的加性滞后斐波那契生成器,但它经过了修改,具有更长的大约周期
.生成器以双精度工作以创建U(0,1)值,并且开放区间(0,1)中的所有值都是可能的。的randn
默认使用的算法swb2712
流是金字巨人算法[7],但与swb2712
发电机。
请注意
该生成器与兰德
函数开始在MATLAB版本5,激活使用兰特(状态,年代)
.
随机数流年代
具有控制其行为的属性。要访问或更改属性,请使用以下语法p = s。
而且s.Property = p
.
例如,您可以配置转换算法来生成正态分布的伪随机值randn
.使用默认值生成正态分布伪随机值金字形神塔
转换算法。
s1 = RandStream(“mt19937ar”);s1。没有rmalTransform
ans = '金字gurat'
R1 = randn(s1,1,10);
属性配置流以使用极地
生成正态分布伪随机值的变换算法。
s1。没有rmalTransform =“极地”
s1 = mt19937ar随机流种子:0 NormalTransform: Polar
R2 = randn(s1,1,10);
在生成具有均匀分布的随机数时使用兰德
,您还可以配置流以生成对立的伪随机值,也就是说,通常的值减去1得到一致的值。
从流中创建6个均匀分布的随机数。
s2 = RandStream(“mt19937ar”);R1 = rand(s2,1,6)
R1 = 0.8147 0.9058 0.1270 0.9134 0.6324 0.0975
恢复流的初始状态。创建另外6个随机数字与对立的
属性设置为true。检查这6个随机数是否等于之前生成的随机数减去1。
重置(s2) s2。对立的=true; r2 = rand(s2,1,6)
R2 = 0.1853 0.0942 0.8730 0.0866 0.3676 0.9025
Isequal (r1,1 - r2)
Ans = 1
您可以保存和恢复流的所有属性,而不是逐个设置流的属性年代
通过使用A = get(s)
而且集(,)
,分别。例如,配置流的所有属性s2
和溪流一样s1
.
A = get(s1)
A = Type: 'mt19937ar' NumStreams: 1 StreamIndex: 1 Substream: 1 Seed: 0 State: [625x1 uint32] NormalTransform: 'Polar' Antithetic: 0 FullPrecision: 1
设置(s2)
类型:'mt19937ar' NumStreams: 1 StreamIndex: 1 Substream: 1 Seed: 0 State: [625x1 uint32] NormalTransform: 'Polar' Antithetic: 0 FullPrecision: 1
的得到
而且集
函数使您能够保存和恢复流的整个配置,以便以后可以完全重现结果。
的状态
属性是随机数生成器的内部状态。在生成随机数以在以后重现结果时,可以在模拟中的某个点保存全局流的状态。
使用RandStream.getGlobalStream
返回全局流的句柄,即当前全局流的句柄兰德
生成随机数。保存全局流的状态。
globalStream = RandStream.getGlobalStream;myState = globalStream.State;
使用myState
,则可以恢复状态globalStream
重现之前的结果。
A =兰特(1100);globalStream。状态=myState; B = rand(1,100); isequal(A,B)
Ans =逻辑1
兰德
,兰迪
,randn
,randperm
访问全局流。由于所有这些函数都访问相同的底层流,因此对其中一个函数的调用会影响其他函数在后续调用中产生的值。
globalStream。状态=myState; A = rand(1,100); globalStream.State = myState; C = randi(100); B = rand(1,100); isequal(A,B)
Ans =逻辑0
属性将流重置为初始设置重置
函数。
reset(globalStream) A = rand(1100);reset(globalStream) B = rand(1100);isequal (A, B)
Ans =逻辑1
[1]德罗耶,L。非均匀随机变量生成, Springer-Verlag, 1986年。
[2] L 'Ecuyer, P.“组合多递归随机数发生器的良好参数集”,运筹学地球科学进展,47(1):159-164。1999.
[3] L'Ecuyer, P.和S. Côté。实现一个具有分割功能的随机数包,ACM数学软件汇刊, 17: 98-111。1991.
[4] L'Ecuyer, P. R. Simard。《TestU01:一个C语言库,用于随机数生成器的实证检验》ACM数学软件汇刊, 33(4):第22条。2007.
[5]吕厄耶,P., R. Simard, E. J.陈,W. D.凯尔顿。具有许多长流和子流的面向对象随机数包运筹学,(6): 1073 - 1075。2002.
[6] Marsaglia, G.“C: The END?”Usenet发布到sci.stat.math。1999.可于https://groups.google.com/group/sci.crypt/browse_thread/
.
线程/ ca8682a4658a124d /
[7] Marsaglia G.和w.w. Tsang。"产生随机变量的神乎其神的方法"统计软件杂志, 5:1-7。2000.可于https://www.jstatsoft.org/v05/i08
.
[8]玛萨格利亚,G.和A.扎曼。"一类新的随机数发生器"应用概率年鉴1(3): 462 - 480。1991.
[9] Marsaglia, G.和w.w. Tsang。“一种快速、容易实现的方法,用于从递减或对称单模密度函数中采样。”SIAM j。Stat。第一版.5(2): 349 - 359。1984.
[10]马斯卡尼,M.和A.斯里尼瓦桑。参数化并行乘法滞后斐波那契生成器并行计算, 30: 899-916。2004.
[11]松本,M.,西村。梅森扭扭器:623维等分布均匀伪随机数发生器建模与计算机仿真汇刊8(1): 3-30。1998.
[12]松本先生,齐藤先生。一个专门研究使用仿射转换的双精度浮点数的PRNG。蒙特卡罗和准蒙特卡罗方法2008, 10.1007 / 978 - 3 - 642 - 04107 - 5 - _38。2009.
[13]摩尔,C.B.MATLAB数值计算.暹罗,2004年。可于//www.tatmou.com/moler
[14]帕克,s.k.和K.W.米勒。“随机数生成器:好的生成器很难找到。”ACM通信31日(10):1192 - 1201。1998.
萨蒙、J. K.莫赖斯、R. O.德罗和D. E.肖。《平行随机数:像1,2,3一样简单》在高性能计算、网络、存储和分析国际会议论文集(SC11).纽约,纽约州:ACM, 2011。