主要内容

控制随机数生成

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

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

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

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

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

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

“从头开始”

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

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

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

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

RNG.
ans =结构体字段:类型:'twister' Seed: 0状态:[625x1 uint32]

下面将详细介绍如何使用上面的输出,包括状态字段,以控制和改变MATLAB如何生成随机数。现在,它是一种查看生成器的方法兰德兰迪, 和randn目前正在使用。

Non-Repeatability

每次你打来电话兰德兰迪,或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。

使用“combRecursive”

rng (0,“combRecursive”

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

这个命令

rng (0,'v4'

选择MATLAB 4.0中默认的生成器算法。

当然,这个命令将随机数生成器返回到它的默认设置。

RNG.默认的

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

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

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

调用RNG.如果没有输入,则返回一个标量结构,其中的字段包含已经描述过的两部分信息:生成器类型和生成器最后被重新播种的整数。

s = rng
S =结构体字段:类型:'twister' Seed: 0状态:[625x1 uint32]

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

虽然只能看到此输出是信息性的,但RNG.还接受设置结构作为输入,以便您可以保存设置,包括状态向量,并在稍后恢复它们以重复计算。因为设置包含生成器类型,所以您将确切地知道您将得到什么,因此“later”可能意味着从同一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' Seed: 0状态:[625x1 uint32]

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

rng (previousSettings)

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

编写更简单,更灵活的代码

RNG.允许你选择

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

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

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

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

RNG.RandStream

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