创建和控制随机数流
的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
Substreams
您可以使用子流来获得不同的结果,这些结果在统计上独立于流。与种子不同的是,种子沿着随机数序列的位置是未知的,子序列之间的间隔是已知的,所以任何重叠的机会都可以消除。简而言之,子流程是一种更受控制的方式,可以做许多传统上使用种子的事情。子流也是一种比并行流更轻量级的解决方案。
子流提供了一种快速简便的方法来确保您在不同时间从相同的代码获得不同的结果。要使用Substream
a的性质RandStream
对象,使用支持子流的生成器创建流。万博1manbetx有关支持子流及其属性的生成器算法的列表,请参见下一节中的表。万博1manbetx例如,在循环中生成几个随机数。
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
方法。
关键字 | 发电机 | 多流和子流支持万博1manbetx | 全精度近似周期 |
---|---|---|---|
mt19937ar |
梅森绕线器(MATLAB启动时默认流使用) | 没有 | 2199371 |
dsfmt19937 |
面向simd的快速梅森捻线机 | 没有 | 2199371 |
mcg16807 |
乘法同余生成器 | 没有 | 2312 |
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
,shr3cong
,swb2712
提供与早期版本的MATLAB的向后兼容性。mt19937ar
和dsfmt19937
主要为顺序应用而设计。其余的生成器为并行随机数生成提供显式支持。万博1manbetx
根据应用程序的不同,有些生成器可能更快,或者返回的值更精确。所有伪随机数生成器都基于确定性算法,并且所有生成器都通过了足够具体的随机性统计测试。检查蒙特卡罗模拟结果的一种方法是使用两个或更多不同的生成器算法重新运行模拟,而MATLAB中生成器的选择为您提供了这样做的方法。虽然在使用不同的生成器时,结果的差异不太可能超过蒙特卡罗抽样误差,但在文献中有一些例子,这种验证已经发现了特定生成器算法中的缺陷。(见[13]举个例子。)
发生器算法
-
mt19937ar
-
Mersenne Twister,在[11],有周期 每个U(0,1)值都是使用两个32位整数创建的。可能的值是的倍数 此生成器不支持多个流或子流。万博1manbetx的
randn
默认使用算法mt19937ar
Streams是ziggurat算法[7],但是mt19937ar
发电机。请注意
这台发电机与英国政府使用的发电机相同
兰德
函数开始于MATLAB Version 7,由激活兰特(捻线机,年代)
。 -
dsfmt19937
-
双精度simd导向的快速梅森捻线机,如所述[12],是一个更快的实现梅森扭转算法。周期是 可能的值是 在区间(0,1)内。生成器在[1,2)中本地产生双精度值,这些值被转换为创建U(0,1)值。此生成器不支持多个流或子流。万博1manbetx
-
mcg16807
-
一个32位乘法同余生成器,如[14],乘数 ,模 。这个发生器的周期是 并且不支持多个流或子流。万博1manbetx每个U(0,1)值都是使用来自生成器的单个32位整数创建的;可能的值都是的倍数 严格在区间(0,1)内
mcg16807
的默认算法randn
极坐标算法(描述在[1])。请注意
该生成器与MATLAB Version 4中开始使用的生成器相同
兰德
和randn
功能,使用兰特(种子,年代)
或randn(种子,年代)
。 -
mlfg6331_64
-
一个64位乘法滞后斐波那契生成器,如[10],有滞后 , 。这个生成器类似于SPRNG包中实现的MLFG。它的周期大约是 。它支持万博1manbetx 并行流,通过参数化,和 每个长度的子流 。每个U(0,1)值都是使用生成器中的一个64位整数创建的;可能的值都是的倍数 严格在区间(0,1)内
randn
默认使用算法mlfg6331_64
Streams是ziggurat算法[7],但是mlfg6331_64
发电机。 -
mrg32k3a
-
一个32位组合多重递归生成器,如[2]。这个生成器类似于c语言中RngStreams包中实现的CMRG 并支持到万博1manbetx 并行流通过序列分裂,每个长度 。它还支持万博1manbetx 子流,每个长度 。每个U(0,1)值都是使用生成器中的两个32位整数创建的;可能的值是的倍数 严格在区间(0,1)内
randn
默认使用算法mrg32k3a
Streams是ziggurat算法[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])的周期约为 。此生成器不支持多个流或子流。万博1manbetx每个U(0,1)值都是使用生成器中的一个32位整数创建的;可能的值都是的倍数 严格在区间(0,1)内
randn
默认使用算法shr3cong
Streams是ziggurat算法的早期形式[9],但是shr3cong
发电机。这台发电机与英国政府使用的发电机相同randn
函数从MATLAB Version 5开始,激活使用randn(状态,年代)
。 -
swb2712
-
修改后的带借减法生成器,如[8]。这个生成器类似于滞后27和滞后12的加性滞后斐波那契生成器,但它被修改为具有更长的近似周期 。生成器以双精度本地工作以创建U(0,1)值,并且开放区间(0,1)中的所有值都是可能的。的
randn
默认使用算法swb2712
Streams是ziggurat算法[7],但是swb2712
发电机。请注意
这台发电机与英国政府使用的发电机相同
兰德
函数从MATLAB Version 5开始,激活使用兰特(状态,年代)
。
转换算法
配置流
随机数流年代
具有控制其行为的属性。要访问或更改属性,请使用语法p = s属性
和属性= p
。
例如,您可以配置转换算法,以便在使用时生成正态分布的伪随机值randn
。使用默认值生成正态分布的伪随机值金字形神塔
转换算法。
s1 = RandStream()“mt19937ar”);s1。没有rmalTransform
ans = 'Ziggurat'
R1 = randn(s1,1,10);
配置流以使用极地
变换算法生成正态分布的伪随机值。
s1。没有rmalTransform =“极地”
s1 = mt19937ar随机流Seed: 0 NormalTransform: Polar
R2 = randn(s1,1,10);
生成均匀分布的随机数时使用兰德
,您还可以配置流来生成对立的伪随机值,也就是说,通常的值从1中减去一致的值。
从流s中创建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
等于(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 = rand(1,100);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) = rand(1,100);reset(globalStream) = rand(1,100);isequal (A, B)
Ans =逻辑1
参考文献
戴维耶,L。非均匀随机变量生成,斯普林格出版社,1986。
[10] L 'Ecuyer, P.“组合多个递归随机数发生器的良好参数集”,运筹学生态学报,47(1):159-164。1999.
[3] L'Ecuyer, P. and S. Côté。《实现具有拆分功能的随机数包》,ACM数学软件汇刊, 17: 98-111。1991.
[b] L'Ecuyer, P.和R. Simard。“TestU01:一个用于随机数生成器实证测试的C库,”ACM数学软件汇刊, 33(4):第22条。2007.
[10]刘永强,陈志强,陈志强。一个具有许多长流和子流的面向对象随机数包。运筹学,(6): 1073 - 1075。2002.
[6] Marsaglia, G.“C的随机数字:结束?”Usenet发布到science .stat.math。1999.可在以下网址下载https://groups.google.com/group/sci.crypt/browse_thread/
。
线程/ ca8682a4658a124d /
[10]马淑丽,曾伟伟。"生成随机变量的ziggurat方法"统计软件杂志, 5:1-7。2000.可在以下网址下载https://www.jstatsoft.org/v05/i08
。
bbbbm Marsaglia, G.和A. Zaman。"一类新的随机数生成器"应用概率年鉴1(3): 462 - 480。1991.
bbbba Marsaglia, G.和w.w.w。从递减或对称单峰密度函数中进行采样的一种快速、容易实现的方法。SIAM J. Sci。Stat。第一版。5(2): 349 - 359。1984.
M. Mascagni和A. Srinivasan。参数化并行乘法滞后斐波那契生成器。并行计算中文信息学报,30:899-916。2004.
[b] M.松本,T.西村。梅森扭扭器:一种623维均匀分布的均匀伪随机数发生器。美国计算机学会建模与计算机仿真汇刊8(1): 3-30。1998.
[qh]松本,M.,齐藤。使用仿射转换的专用于双精度浮点数的PRNG。蒙特卡罗和拟蒙特卡罗方法2008, 10.1007 / 978 - 3 - 642 - 04107 - 5 - _38。2009.
b . b .莫勒MATLAB数值计算。暹罗,2004年。可在以下网址下载//www.tianjin-qmedu.com/moler
[14] Park, s.k.和K.W. Miller。“随机数生成器:好的很难找到。”ACM通讯31日(10):1192 - 1201。1998.
[15] Salmon, J. K., M. A. Moraes, R. O. Dror, D. E. Shaw。“平行随机数:像1,2,3一样简单。”在高性能计算、网络、存储和分析国际会议论文集(SC11)。纽约:ACM, 2011。