主要内容

控制随机数的产生

这个例子展示了如何使用rng函数,它提供对随机数生成的控制。

matlab中的(伪)随机数来自兰特兰迪,兰德功能。许多其他函数都会调用这三个函数,但它们是基本的构建块。这三个都依赖于您可以使用的单个共享随机数生成器rng

重要的是要意识到MATLAB中的“随机”数字根本不是不可预测的,而是由确定性算法生成。该算法被设计为充分复杂,以便其输出出现对不知道算法的人来说是一个独立的随机序列,并且可以通过各种随机统计检验。这里介绍的函数提供了利用决定论的方法

  • 重复涉及随机数的计算,并获得相同的结果,或

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

并利用明显的随机性来证明从单独计算中得出的结果的合理性。

“重新开始”

如果你看一下输出兰特兰迪, 或者兰德在新的MATLAB会话中,您会注意到它们每次重新启动MATLAB时它们会返回相同的数字序列。能够将随机数生成器重置为该启动状态通常有用,而无需实际重新启动MATLAB。例如,您可能希望重复涉及随机数的计算,并获得相同的结果。

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

rng默认兰特%返回与启动时相同的值
ANS = 0.8147.

MATLAB启动的“默认”随机数设置是什么,或者rng违约给你吗?如果你叫rng没有输入,你可以看到它是Mersenne Twister发生器算法,播种为0。

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

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

Non-Repeatability

每次打电话兰特兰迪, 或者兰德,它们从共享随机数生成器中汲取新值,并且连续值可以被视为统计上独立的。但如上所述,每次重新启动MATLAB时,这些功能都被重置并返回相同的数字序列。显然,计算使用的计算相同的“随机”数字不能被认为是统计上独立的。因此,当有必要结合计算在两个或更多的MATLAB会话,就像他们统计上独立,您无法使用默认的生成器设置。

避免在新的MATLAB会话中重复相同随机数的一个简单方法是为随机数生成器选择不同的种子。rng给你一个简单的方法,通过创建一个基于当前时间的种子。

rng洗牌兰特
ans = 0.1796

每次使用“洗牌”,它用不同的种子重新播种发电机。你可以叫rng没有输入来查看它实际使用的种子。

rng
ans =结构体字段:类型:'Twister'种子:1753258925状态:[625x1 UINT32]
rng洗牌%每次都会产生不同的种子rng
ans =结构体字段:类型:'twister' Seed: 1753258931 State: [625x1 uint32]
兰特
ans = 0.4292

“洗牌”是一种非常简单的方法来重新填充随机数生成器。您可能认为在MATLAB中使用它来获得“真正的”随机性是一个好主意,甚至是必要的。不过,在大多数情况下,没有必要使用“洗牌”在所有.根据当前时间选择种子不会改善您从中获得的值的统计特性兰特兰迪,兰德,并没有让它们在任何真正意义上“更随机”。虽然是完全可以补播发电机每次你启动MATLAB,或在你运行一些大型计算包括随机数,它实际上不是一个好主意补种发电机过于频繁地在一个会话,因为这可以影响你的随机数的统计特性。

什么“洗牌”提供了一种避免重复相同序列值的方法。有时这很重要,有时只是“好”,但往往一点都不重要。记住,如果你使用“洗牌”,你可能想要保存的种子rng这样你以后就可以重复计算了。您将在下面看到如何做到这一点。

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

到目前为止,您已经了解如何将随机数生成器重置为其默认设置,并使用使用当前时间创建的种子重新定位。rng还提供了一种使用特定种子重新播种的方法。

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

RNG(1)%种子是任何< 2^32的非负整数x = randn(1,5)
X =1×5-0.6490 1.1812 -0.7585 -1.1096 -0.8456
Rng (1) x = Rng (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的随机数生成器,因为它影响所有后续输出兰特兰迪,兰德.除非您需要可重复性或唯一性,否则通常建议只生成随机值而不重新播种生成器。如果您确实需要重新播种生成器,那么最好在命令行中进行,或者在代码中不易被忽略的地方进行。

选择发电机类型

您不仅可以将随机数发生器重置如上所示,您还可以选择要使用的随机数生成器的类型。不同的发电机类型产生不同的随机数序列,例如,由于其统计属性,您可以选择特定类型。或者您可能需要通过使用不同的默认生成器类型的旧版MATLAB重新创建结果。

选择生成器类型的另一个常见原因是,您正在编写一个生成“随机”输入数据的验证测试,并且您需要保证您的测试总是能够得到完全相同的可预测结果。如果你叫rng在创建输入数据之前使用种子,它将重新种子化随机数生成器。但如果生成器类型因某种原因被更改,则兰特兰迪,兰德不会是你所期望的那样。因此,为了100%确定可重复性,您还可以指定生成器类型。

例如,

RNG(0,'twister'

原因兰特兰迪,兰德使用Mersenne Twister发生器算法,将其播种为0。

使用“combRecursive”

RNG(0,“combRecursive”

选择组合多重递归生成器算法,它支持梅森龙卷风不支持的一些并行特性。金宝app

这个命令

RNG(0,v4的

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

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

rng默认

然而,由于默认随机数生成器设置可能会在MATLAB版本之间改变,使用“默认”并不能保证长期的可预测的结果。“默认”是重置随机数发生器的便捷方式,但是对于更高的可预测性,请指定发电机类型和种子。

另一方面,当您以交互方式工作并需要重复性时,它更简单,通常就足够了rng只有一粒种子。

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

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

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

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

虽然能够看到这个输出是很有用的,rng也接受设置结构作为输入,以便您可以保存设置,包括状态向量,并在稍后恢复它们以重复计算。因为设置包含生成器类型,所以您将确切地知道您将得到什么,因此“later”可能意味着从同一MATLAB会话中的片刻之后到数年(和多个MATLAB版本)之后的任何事情。您可以从保存生成器设置的随机数序列中的任意点重复结果。例如

x1 = randn (10,10);%以随机数序列前进s = RNG;%此时保存设置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中的一个遗留生成器创建值,您可以在切换到使用旧生成器的同时保存当前设置……

previousSettings = rng (0,“v5uniform”
以前的思考=结构体字段:类型:'twister' Seed: 0状态:[625x1 uint32]

...然后稍后还原原始设置。

RNG(以前的例)

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

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

rng允许你

  • 重新填充随机数生成器,或者

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

不需要知道它是什么类型的。您还可以将随机数生成器返回到其默认设置,而不需要知道这些设置是什么。但有些情况下你可能会要指定生成器类型,rng为你提供简单的指定它。

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

rngrandstream.

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