主要内容

创建和控制随机数流

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的属性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

发电机的mcg16807shr3cong,swb2712提供与MATLAB早期版本的向后兼容性。mt19937ar而且dsfmt19937主要是为顺序应用程序设计的。其余生成器提供了对并行随机数生成的显式支持。金宝app

根据应用程序的不同,有些生成器可能更快,或者返回的值更精确。所有伪随机数生成器都基于确定性算法,并且所有生成器都通过了足够特定的随机性统计测试。检查蒙特卡罗模拟结果的一种方法是使用两个或多个不同的生成器算法重新运行模拟,MATLAB中生成器的选择为您提供了这样做的方法。虽然使用不同的生成器时,结果的差异不太可能超过蒙特卡罗抽样误差,但在文献中有这样的例子,这种验证在特定的生成器算法中发现了缺陷。(见[13]举个例子。)

发生器算法

mt19937ar

梅森龙卷风,如描述[11],有周期 2 19937 1 每个U(0,1)值是使用两个32位整数创建的。可能的值是的倍数 2 53 该生成器不支持多流或多子流。金宝app的randn默认使用的算法mt19937ar流是金字巨人算法[7],但与mt19937ar发电机。

请注意

该生成器与兰德函数开始于MATLAB版本7,由兰特(捻线机,年代)

dsfmt19937

双精密simd导向快速梅森扭扭机,如描述[12],是梅森Twister算法的一个更快的实现。周期是 2 19937 1 可能的值是的倍数 2 52 在(0,1)的区间内。生成器生成[1,2)的双精度值,这些值被转换为U(0,1)值。此生成器不支持多流或子流。金宝app

mcg16807

32位乘法同余发生器,如中所述[14],有乘数 一个 7 5 ,模 2 31 1 .这个发生器的周期是 2 31 2 并且不支持多流或子流。金宝app每个U(0,1)值都是使用生成器中的一个32位整数创建的;可能的值都是的倍数 2 31 1 1 严格在区间(0,1)内,对于mcg16807的默认算法randn极坐标算法(描述在[1]).

请注意

该生成器与MATLAB版本4中开始使用的生成器相同兰德而且randn功能,使用激活兰特(种子,年代)randn(种子,年代)

mlfg6331_64

64位乘法滞后斐波那契生成器,如中所述[10],有滞后 l 63 k 31 .这个生成器类似于在SPRNG包中实现的MLFG。它的周期大约是 2 124 .它支持金宝app到 2 61 并行流,通过参数化和 2 51 每个子流的长度 2 72 .每个U(0,1)值都是使用生成器中的一个64位整数创建的;可能的值都是的倍数 2 64 严格在(0,1)区间内randn默认使用的算法mlfg6331_64流是金字巨人算法[7],但与mlfg6331_64发电机。

mrg32k3a

32位组合的多个递归生成器,如中所述[2].这个生成器类似于在c语言的RngStreams包中实现的CMRG 2 191 并支持到金宝app 2 63 并行流通过序列分裂,每个长度 2 127 .它还支持金宝app 2 51 子流,每个子流的长度 2 76 .每个U(0,1)值是使用生成器中的两个32位整数创建的;可能的值是的倍数 2 53 严格在(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移位寄存器发生器与带乘法器的线性同余发生器相加 一个 69069 ,加数 b 1234567 ,模量 2 32 .SHR3是一个3移位寄存器发生器,定义为 u u + l 13 + R 17 + l 5 ,在那里 是恒等算子, l 是左移运算符,和R是右移位运算符。组合生成器(SHR3部分在[7])的周期约为 2 64 .此生成器不支持多流或子流。金宝app每个U(0,1)值是使用生成器中的一个32位整数创建的;可能的值都是的倍数 2 32 严格在(0,1)区间内randn默认使用的算法shr3cong流是ziggurat算法的早期形式[9],但与shr3cong发电机。该生成器与randn函数开始在MATLAB版本5,激活使用randn(状态,年代)

请注意

SHR3发生器用于[6](1999)与[7](2000)。MATLAB使用的生成器的最新版本,在[7]

swb2712

修改的带借减法生成器,如中所述[8].该生成器类似于延迟27和12的加性滞后斐波那契生成器,但它经过了修改,具有更长的大约周期 2 1492 .生成器以双精度工作以创建U(0,1)值,并且开放区间(0,1)中的所有值都是可能的。的randn默认使用的算法swb2712流是金字巨人算法[7],但与swb2712发电机。

请注意

该生成器与兰德函数开始在MATLAB版本5,激活使用兰特(状态,年代)

转换算法

反演

通过将标准正态逆累积分布函数应用于均匀随机变量来计算正态随机变量。每个正常值只消耗一个统一的值。

极地

极值抑制算法,如中所述[1].平均而言,每正常值消耗大约1.27个统一值。

金字形神塔

ziggurat算法,如中所述[7].平均而言,每正常值消耗大约2.02个统一值。

配置流

随机数流年代具有控制其行为的属性。要访问或更改属性,请使用以下语法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。

另请参阅

|

相关的话题