Matlab 随机数 rng:选择种子

Matlab random number rng: choosing a seed

我想更准确地知道当您在 Matlab 中选择自定义种子时会发生什么,例如:

rng(101)

根据我对伪随机数生成器工作原理的(有限的,但仍然存在的)理解,可以从概念上将种子视为 在“[=21] 中选择一个位置 =]很长的伪随机数列表".

问题:假设(在我的 Matlab 脚本中),我选择 rng(100) 进行第一次计算(指令序列),然后选择 rng(1e6) 进行第二次计算。请注意,每次我进行一些计算时,都会涉及生成多达 300k 个随机数(每次)。

-> 这是否意味着我确保 "list" 中从 100 开始到 300k 左右结束的序列与从 1e6 开始到 1'300'000 结束的序列之间没有重叠? ("no overlap" 的想法来自于 rng(100) 和 rng(1e6) 相隔超过 300k 的事实)

即这些是 2 "independent" 序列,(据我所知,这个 'long list' 将由特殊的 PRNG 算法生成,很可能涉及模块化算法..?)

不,事实并非如此。种子和生成数字列表中的 "position" 之间的映射不是线性的,您实际上可以将其解释为 hash/one 函数。实际上可能会发生我们将相同的数字序列移动一个位置(但这不太可能)。

默认情况下,MATLAB 使用 Mersenne Twister (source)

不完全是。您给 rng 的种子是用于生成伪随机数的 Mersenne Twister 算法(默认情况下)的起始点。如果您选择两个不同的种子(无论它们的相对非负整数值,除了一两个特殊情况),您将拥有有效独立的伪随机数流。

对于“99%”的人来说,对 rng 进行播种的主要用途是使用 'shuffle' 参数(使用基于时间的非默认种子来帮助确保跨多个生成的数字的独立性会话),或者给它一个特定的种子(以便能够在以后重现相同的伪随机流)。如果你试图进一步精炼种子而不是非常小心,你更有可能导致问题而不是做任何有用的事情。

RandStream 可用于断开单独的伪随机数流,如果这对您的应用程序真的很重要(可能不重要)。