主要内容

控制随机数生成

此示例显示了如何使用RNG.功能,提供对随机数生成的控制。

(伪)随机数在MATLAB中来源于兰德兰迪, 和randn功能。许多其他功能称之为这三个,但这些是基本构建块。所有三个都依赖于可以控制使用的单个共享随机数生成器RNG.

重要的是要认识到MATLAB中的“随机数”根本不是不可预测的,而是由确定性算法生成的。该算法被设计得足够复杂,以便其输出出现要成为不了解算法的人的独立随机序列,可以通过各种随机性统计测试。这里介绍的功能提供了利用决定措施的方法

  • 重复计算随机数字,得到相同的结果,或者

  • 保证在重复计算中使用不同的随机数

并利用明显的随机性,以证明单独计算的组合结果。

“从头开始”

如果你看一下兰德兰迪,或randn在新的MATLAB会话中,您会注意到,每次重新启动MATLAB时,它们都会返回相同的数字序列。在不重新启动MATLAB的情况下,将随机数生成器重置为启动状态通常是很有用的。例如,您可能希望重复一个包含随机数的计算,并得到相同的结果。

RNG.提供一种非常简单的方法来将随机数生成器放回其默认设置。

RNG.默认的兰德%返回与启动时相同的值
ans = 0.8147

MATLAB启动时的“默认”随机数设置是什么RNG默认值给你?如果你打电话RNG.在没有输入的情况下,您可以看到它是Mersenne Twister生成器算法,种子为0。

RNG.
ans =.结构与字段:类型:'Twister'种子:0状态:[625x1 UINT32]

您将在下面更详细地了解如何使用上述输出,包括状态字段,控制和更改MATLAB如何生成随机数。目前,它是一种看什么发生器的方法兰德兰迪, 和randn目前正在使用。

不可重复性

每次你打来电话兰德兰迪,或randn,它们从共享的随机数生成器中提取一个新值,连续的值可以被视为统计上独立的。但正如上面提到的,每次重新启动MATLAB时,这些函数都被重置并返回相同的数字序列。显然,计算使用相同“随机”数字不能被认为是统计上独立的。因此,当有必要将在两个或更多Matlab会话中组合的计算,就像他们一样统计独立,不能使用默认的生成器设置。

一种简单的方法来避免在新的Matlab会话中重复相同的随机数是为随机数发生器选择不同的种子。RNG.通过创建基于当前时间的种子来为您提供一种简单的方法。

RNG.洗牌兰德
ans = 0.3862.

每次你使用'洗牌',用不同的种子将发电机重新排放。你可以打电话RNG.没有输入看它实际使用的种子。

RNG.
ans =.结构与字段:类型:'twister' Seed: 113297371 State: [625x1 uint32]
RNG.洗牌%每次创建一个不同的种子RNG.
ans =.结构与字段:类型:'Twister'种子:113297379状态:[625x1 UINT32]
兰德
ans = 0.6415

'洗牌'是一个非常简单的方法来重新定位随机数发生器。您可能会认为这是一个好主意,甚至是必要的,使用它在Matlab中获得“真实”随机性。但是,对于大多数目的而言,没有必要使用'洗牌'当然.基于当前时间选择种子不会改善您将得到的值的统计属性兰德兰迪, 和randn,并且在任何真实意义上都不会使它们“更随机”。虽然每次启动MATLAB,或者在运行某种涉及随机数的大型计算之前,它是完全没用的,但在涉及随机数的情况下,它实际上并不是一个好主意在会话中经常重新定位发电机,因为这可能会影响随机数的统计属性。

什么'洗牌'确实提供是一种避免重复相同的值序列的方法。有时这是至关重要的,有时它只是“很好”,但通常它根本不重要。请记住,如果你使用'洗牌',你可能想要拯救种子RNG.创建以便稍后重复计算。你会看到以下该怎么做。

更好地控制重复性和不可重复性

到目前为止,您已经了解了如何将随机数生成器重置为其默认设置,以及如何使用使用当前时间创建的种子来重新seed它。RNG.还提供了使用特定种子重新预留它的方法。

您可以多次使用相同的种子,以重复相同的计算。例如,如果您运行这段代码两次…

rng (1)种子是任何非负整数<2 ^ 32x = randn(1、5)
x =1×5-0.6490 1.1812 -0.7585 -1.1096 -0.8456
rng(1)x = randn(1,5)
x =1×5-0.6490 1.1812 -0.7585 -1.1096 -0.8456

......你完全相同的结果。你可能会这样做来重建x清除后,使您可以重复在随后的计算中发生的事情x,使用这些特定值。

另一方面,您可能想选择不同的种子确保您不重复相同的计算。例如,如果您在一个MATLAB会话中运行此代码...

rng(2)x2 = sum(randn(50,1000),1);随机步行的%1000试验

和这个代码在另一个...

Rng (3) x3 = sum(randn(50,1000),1); / /计算结果

......你可以结合两种结果并确信他们不仅仅是两次重复的结果。

x = [x2 x3];

和人一样'洗牌'在重新定义MATLAB的随机数发生器时存在警告,因为它会影响来自的所有后续输出兰德兰迪, 和randn.除非您需要重复性或唯一性,否则通常建议只需在不重新定义发电机的情况下生成随机值。如果您确实需要重新预留生成器,通常最好在命令行中完成,或者在您的代码中不容易被忽视的位置。

选择发电机类型

您不仅可以如上所示重新设置随机数生成器的种子,还可以选择要使用的随机数生成器的类型。不同的生成器类型产生不同的随机数序列,例如,您可以根据其统计属性选择特定的类型。或者,您可能需要从使用不同默认生成器类型的旧版本MATLAB重新创建结果。

选择生成器类型的其他共同原因是您正在编写一个生成“随机”输入数据的验证测试,并且您需要保证您的测试可以随时期望完全相同的可预测结果。如果你打电话RNG.使用在创建输入数据之前的种子,它将重新定位随机数发生器。但如果由于某种原因而改变了发电机类型,则输出兰德兰迪, 和randn不会是你对那种种子的期望。因此,要100%的可重复性,您还可以指定生成器类型。

例如,

rng (0,“旋风”

原因兰德兰迪, 和randn使用Mersenne Twister生成器算法,在它的种子为0。

使用'幸福父母'

rng (0,'幸福父母'

选择组合的多个递归生成器算法,该算法支持MerseNne Twister没有的一些并行功能。金宝app

这个命令

rng (0,'v4'

选择Matlab 4.0中的生成器算法。

当然,此命令将随机数生成器返回到其默认设置。

RNG.默认的

但是,由于默认随机数生成器设置可能会在Matlab版本之间发生变化,因此使用'默认'不保证可预测的结果,即长期。'默认'是重置随机数生成器的一种方便的方法,但为了更可预测性,请指定生成器类型和种子。

另一方面,当您交互工作并需要可重复性时,调用就更简单,通常也足够了RNG.只是种子。

保存和恢复随机数生成器设置

打电话RNG.没有输入返回标量结构,其中包含已描述的两条信息的字段:生成类型,以及上次重新预期发电机的整数。

s = rng
S =结构与字段:类型:'Twister'种子:0状态:[625x1 UINT32]

第三个字段,状态,包含生成器当前状态向量的副本。状态向量是生成器内部维护的信息,以便在其随机数序列中生成下一个值。每次你打来电话兰德兰迪,或randn,它们共享的生成器更新其内部状态。因此,返回的设置结构中的状态向量RNG.包含从捕获状态的点开始重复序列所需的信息。

虽然只能看到此输出是信息性的,但RNG.还接受设置结构作为输入,因此您可以保存包括状态向量的设置,并稍后恢复它们以重复计算。因为设置包含生成器类型,所以您将确切地知道您所获得的内容,因此“稍后”可能意味着在同一MATLAB会话中的时刻,稍后会发生几年(和多个MATLAB版本)。您可以在保存生成器设置的随机数序列中重复任何点的结果。例如

x1 = randn(10,10);%在随机数序列中向前移动s =提高;%在此时保存设置x2 = randn(1,5)
x2 =1×50.8404 -0.8880 0.1001-0.5445 0.3035
x3 = randn (5,5);%在随机数序列中向前移动rng(年代);%将发电机返回保存状态x2 = randn(1,5)%重复相同的数字
x2 =1×50.8404 -0.8880 0.1001-0.5445 0.3035

注意,虽然重新播种只提供了粗略的重新初始化,但使用设置结构保存和恢复生成器状态允许重复任何随机数序列的一部分。

使用设置结构的最常用方法是恢复生成状态。但是,由于该结构不仅包含状态,而且还包含发电机类型和种子,它也是临时切换发电机类型的便捷方式。例如,如果您需要使用来自Matlab 5.0的传统生成器之一创建值,则可以在您切换到使用旧生成器的同时保存当前设置...

以前的settings = rng(0,'v5Uniform'
previousSettings =结构与字段:类型:'Twister'种子:0状态:[625x1 UINT32]

...然后再恢复原来的设置。

rng (previousSettings)

您不应修改设置结构中的任何字段的内容。特别是,您不应构建自己的状态向量,甚至取决于生成器状态的格式。

写得更简单,更灵活,代码

RNG.允许你选择

  • 重新设置随机数发生器,或

  • 保存和恢复随机数生成器设置

不必知道它是什么类型的。您还可以将随机数生成器返回到其默认设置,而无需了解这些设置是什么。虽然有可能的情况想要要指定生成器类型,RNG.给你不简单的东西拥有来指定它。

如果您能够避免指定生成器类型,那么您的代码将自动适应需要使用不同生成器的情况,并将自动受益于新的默认随机数生成器类型中的改进属性。

RNG.RandStream

RNG.提供了一种控制Matlab中随机数生成的便捷方式,以获得最常见的需求。然而,涉及多个随机数流和并行随机数生成的更复杂的情况需要更复杂的工具。这RandStream类是该工具,它提供了控制随机数生成的最强大的方法。这两个工具是互补的,RNG.提供更简单而简洁的语法,该语法是基于灵活性的RandStream