创建和控制一个随机数流
的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:金字塔
RandStream.getGlobalStream==myStream
ans = 1
Substreams
您可以使用substreams来得到不同的结果在统计上是独立于一个流。不像种子,沿着随机数序列的位置并不完全知道,substreams之间的间距是已知的,因此可以消除任何重叠的机会。简而言之,substreams是许多相同的控制的方法传统上被用于种子的事情。Substreams也比平行流更轻量级的解决方案。
Substreams提供一个快速和简单的方式,以确保您得到不同的结果在不同的时间相同的代码。使用Substream
财产的RandStream
对象,创建一个使用生成器,支持substreams流。金宝app的发生器算法列表支持substreams及其属性,表在下一节中看到。金宝app例如,生成一些随机的数字在一个循环中。
myStream = RandStream (“mlfg6331_64”);RandStream.setGlobalStream (myStream)为我= 1:5 myStream。Substream =我;z =兰特(我)结束
z z = 0.6986 z = 0.9230 - 0.2489 = 0.0261 0.2530 0.0737 z z = 0.2067 = 0.3220 0.7405 0.1983 0.1052 0.2417 0.9777 0.5970 0.4187
在另一个循环,您可以生成随机值独立于第一组5次迭代。
为我= 6:10 myStream。Substream =我;z =兰特(我)结束
z = 0.2650 0.8229 0.2479 0.0247 0.4581 z z = = 0.3963 0.7445 0.7734 0.9113 0.2758 0.3662 0.7979 z z = 0.6814 - 0.5150 = 0.5247
在串行计算Substreams是有用的。Substreams可以再现仿真的全部或部分返回一个特定的检查点在流。例如,您可以返回到6日substream循环。结果如上6日输出包含相同的值。
myStream。Substream=6; z = rand(1,5)
z = 0.2650 0.8229 0.2479 0.0247 0.4581
选择一个随机数字生成器
MATLAB提供了几种发生器算法的选择。表总结了关键属性可用的发生器算法和关键字用于创建它们。返回一个列表的所有可用的发生器算法,使用RandStream.list
方法。
关键字 | 发电机 | 多个流和Substream支持金宝app | 近似的时期完全精确 |
---|---|---|---|
mt19937ar |
梅森素数捻线机(使用默认流在MATLAB启动时) | 没有 | 219937年1 |
dsfmt19937 |
SIMD-oriented快速梅森素数捻线机 | 没有 | 219937年1 |
mcg16807 |
可乘同余发电机 | 没有 | 231日2 |
mlfg6331_64 |
乘法滞后斐波那契发电机 | 是的 | 2124年(251流长度为2的72年) |
mrg32k3a |
结合多个递归发电机 | 是的 | 2191年(263年流长度为2的127年) |
philox4x32_10 |
Philox 4×10轮发电机 | 是的 | 2193年(264年流长度为2的129年) |
threefry4x64_20 |
Threefry 4 x64和20轮发电机 | 是的 | 2514年(2256年流长度为2的258年) |
shr3cong |
移位寄存器发电机总结与线性同余发生器 | 没有 | 264年 |
swb2712 |
修改减去借发电机 | 没有 | 21492年 |
发电机的mcg16807
,shr3cong
,swb2712
与早期版本的MATLAB提供向后兼容性。mt19937ar
和dsfmt19937
设计主要是为序贯应用程序。剩下的发电机提供显式支持并行随机数生成。金宝app
根据不同的应用程序,可能会更快一些发电机或返回值更加精确。所有的伪随机数生成器是基于确定性算法,和所有发电机通过一个足够随机性的统计检验。一种检查蒙特卡罗模拟的结果是与两个或两个以上的不同重新运行仿真发生器算法,在MATLAB和发电机的选择提供了手段。虽然不太可能,你的结果会相差超过蒙特卡洛抽样误差时使用不同的发电机,有文学中这种例子验证了特定发生器算法中的缺陷。(见[13]为例)。
发生器算法
-
mt19937ar
-
梅森素数捻线机,所述[11]期, 和每个U(0,1)值创建使用两个32位的整数。可能的值的倍数 在区间(0,1)。这个发电机不支持多个流或substreams。金宝app的
randn
默认情况下使用的算法mt19937ar
流梯形金字塔算法[7],但mt19937ar
发电机。请注意
这个发电机是一样使用的
兰德
函数在MATLAB版本7,激活兰特(捻线机,年代)
。 -
dsfmt19937
-
双精度SIMD-oriented快速梅森素数捻线机,所述[12],是一个梅森素数捻线机的快速实现算法。周期是 和可能的值的倍数 在区间(0,1)。发电机产生双精度值(1、2)本身,它改变了创建U(0,1)值。这个发电机不支持多个流或substreams。金宝app
-
mcg16807
-
一个32位的乘法同余发电机,所述[14],乘数 ,模 。这个发电机有一段时间的 和不支持多个流或subst金宝appreams。创建的每个U(0,1)值是使用一个32位整数的发电机;可能的值的倍数 严格时间间隔内(0,1)。
mcg16807
流,使用默认的算法randn
极地算法(描述[1])。请注意
这个发电机是一样的在MATLAB版本4的开始使用
兰德
和randn
功能,激活使用兰特(种子,年代)
或randn(种子,年代)
。 -
mlfg6331_64
-
一个64位的乘法滞后斐波那契发电机,所述[10],滞后 , 。这个发电机类似于MLFG在受惊包中实现。它有一个大约的时期 。它支持金宝app了 并行流,通过参数化 substreams每个长度 。创建的每个U(0,1)值是使用一个64位整数的发电机;可能的值的倍数 严格时间间隔内(0,1)的
randn
默认情况下使用的算法mlfg6331_64
流梯形金字塔算法[7],但mlfg6331_64
发电机。 -
mrg32k3a
-
32位组合多个递归发生器,所述[2]。这种发电机类似于CMRG RngStreams包中实现的c的时期 和支持金宝app 通过序列分割并行流,每个长度 。它还支持金宝app substreams,每个长度 。创建的每个U(0,1)值是使用两个32位整数的发电机;可能的值的倍数 严格时间间隔内(0,1)的
randn
默认情况下使用的算法mrg32k3a
流梯形金字塔算法[7],但mrg32k3a
发电机。 -
philox4x32_10
-
4 x32生成器中描述与10轮[15]。这个发电机使用Feistel网络和整数乘法。发电机是高度并行系统中专门为高性能设计如gpu。它有一段2193年(264年流长度为2的129年)。
-
threefry4x64_20
-
4 x64发生器与20轮中描述[15]。这个发电机non-cryptographic改编的绞的Threefish块密码哈希函数。它有一段2514年(2256年流长度为2的258年)。
-
shr3cong
-
马的SHR3移位寄存器发电机总结与乘数进行线性同余发生器 ,加数 和模量 。SHR3 3-shift-register生成器被定义为 ,在那里 标识符, 左移运算符,R运营商是正确的转变。合并后的发电机(SHR3部分中描述[7])有一个大约的时期 。这个发电机不支持多个流或substreams。金宝app创建的每个U(0,1)值是使用一个32位整数的发电机;可能的值的倍数 严格时间间隔内(0,1)的
randn
默认情况下使用的算法shr3cong
金字形神塔流是早期形式的算法[9],但shr3cong
发电机。这个发电机是一样使用的randn
函数开始在MATLAB版本5中,激活使用randn(状态,年代)
。 -
swb2712
-
修改Subtract-with-Borrow生成器中描述[8]。这种发电机类似于一个添加剂滞后斐波那契发电机落后27日和12日,但大约有更长时间的修改 。发电机工作在创建U(0, 1)双精度值,和所有在开区间值(0,1)是可能的。的
randn
默认情况下使用的算法swb2712
流梯形金字塔算法[7],但swb2712
发电机。请注意
这个发电机是一样使用的
兰德
函数开始在MATLAB版本5中,激活使用兰特(状态,年代)
。
转换算法
配置一个流
一个随机数流年代
属性,控制其行为。访问或改变一个属性,使用语法p = s.Property
和年代。属性= p
。
例如,您可以配置转换算法来生成正态分布在使用伪随机值randn
。使用默认生成正态分布伪随机值金字形神塔
转换算法。
s1 = RandStream (“mt19937ar”);s1.NormalTransform
ans =‘神’
r1 = randn (s1, 1 10);
配置流使用极地
转换算法来生成正态分布伪随机值。
s1.NormalTransform=“极地”
s1 = mt19937ar随机流种子:0 NormalTransform:极性的
r2 = randn (s1, 1 10);
当生成随机数的均匀分布兰德
,您还可以配置流生成对偶的伪随机值,也就是说,通常值减去1的统一的价值观。
创建6个均匀分布的随机数流。
s2 = RandStream (“mt19937ar”);r1 =兰德(s2, 1, 6)
r1 = 0.8147 0.9058 0.1270 - 0.9134 0.6324 - 0.0975
恢复初始状态的流。创建另一个6的随机数对立的
属性设置为true。检查这六个随机数等于前面生成的随机数字减去1。
重置(s2) s2。对立的=true; r2 = rand(s2,1,6)
r2 = 0.1853 0.0942 0.8730 - 0.0866 0.3676 - 0.9025
isequal (r1, r2 1 -)
ans = 1
而不是设置的属性流一个接一个,你可以保存和恢复所有流的性质年代
通过使用=得到(s)
和集(,)
,分别。例如,配置所有流的属性s2
一样的流s1
。
一个=得到(s1)
=类型:“mt19937ar”NumStreams: 1 StreamIndex: 1 Substream: 1种子:0状态:x1 uint32 [625] NormalTransform:“极地”对立的:0 FullPrecision: 1
设置(s2)
类型:‘mt19937ar NumStreams: 1 StreamIndex: 1 Substream: 1种子:0状态:x1 uint32 [625] NormalTransform:“极地”对立的:0 FullPrecision: 1
的得到
和集
函数允许您保存和恢复流的整个配置,这样的结果是可再生的。
恢复状态的随机数字生成器繁殖输出
的状态
属性是随机数发生器的内部状态。您可以保存的状态时全球流在一定程度上模拟产生随机数复制之后的结果。
使用RandStream.getGlobalStream
返回一个句柄全球流,也就是说,当前全球流兰德
生成随机数。拯救全球流的状态。
globalStream = RandStream.getGlobalStream;myState = globalStream.State;
使用myState
,你可以恢复的状态globalStream
以前和繁殖的结果。
一个=兰德(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
您还可以使用流重置到初始设置重置
函数。
重置(globalStream) =兰德(1100);重置(globalStream) B =兰德(1100);isequal (A, B)
ans =逻辑1
引用
[1]Devroye, L。非均匀随机变量生成斯普林格出版社,1986年版。
L 'Ecuyer [2], p .“好结合多个递归随机数生成器参数设置”,运筹学47 (1):159 - 164。1999年。
L 'Ecuyer [3], p和s .象牙海岸。“与分裂设施实现随机数包”,ACM交易的数学软件17:98 - 111。1991年。
L 'Ecuyer [4], p, r . Simard。“TestU01: C库随机数生成器的实证测试”ACM交易的数学软件,33(4):22条。2007年。
L 'Ecuyer [5], P。,R。Simard, E. J. Chen, and W. D. Kelton. “An Objected-Oriented Random-Number Package with Many Long Streams and Substreams.”运筹学,(6):1073 - 1075。2002年。
[6]马,g . C的随机数:结束?“Usenet sci.stat.math发布。1999年。可以在网上https://groups.google.com/group/sci.crypt/browse_thread/
。
线程/ ca8682a4658a124d /
[7]马G。,W. W. Tsang. “The ziggurat method for generating random variables.”杂志的统计软件,5:1-7。2000年。可以在网上https://www.jstatsoft.org/v05/i08
。
[8]马,G。和a·扎曼。“一类新的随机数生成器”。《应用概率1 (3):462 - 480。1991年。
[9]马,G。,W. W. Tsang. “A fast, easily implemented method for sampling from decreasing or symmetric unimodal density functions.”暹罗j .科学。Stat。第一版。5 (2):349 - 359。1984年。
[10]Mascagni, M。,A. Srinivasan. “Parameterizing Parallel Multiplicative Lagged-Fibonacci Generators.”并行计算30:899 - 916。2004年。
[11]松本,M。,T. Nishimura.“Mersenne Twister: A 623-Dimensionally Equidistributed Uniform Pseudorandom Number Generator.”ACM事务建模和计算机模拟8 (1):3-30。1998年。
[12]松本,M。和m .斋藤。“PRNG专业双精度浮点数使用仿射转换。”2008年蒙特卡洛和Quasi-Monte卡洛方法,10.1007 / 978 - 3 - 642 - 04107 - 5 - _38。2009年。
[13]硅藻土,C.B.与MATLAB数值计算。暹罗,2004年。可以在网上//www.tatmou.com/moler
[14]公园,”栏目,K.W. Miller. “Random Number Generators: Good Ones Are Hard to Find.”ACM的通信31日(10):1192 - 1201。1998年。
[15]鲑鱼,j·K。,M. A. Moraes, R. O. Dror, and D. E. Shaw. "Parallel Random Numbers: As Easy As 1, 2, 3." In学报为高性能计算国际会议,网络,存储和分析(SC11)。纽约,纽约州:ACM, 2011年。