【问题标题】:Matlab random number rng: choosing a seedMatlab随机数rng:选择种子
【发布时间】:2020-04-25 01:57:51
【问题描述】:

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

rng(101)

根据我对伪随机数生成器如何工作的(有限的,但仍然存在的)理解,可以从概念上将种子视为在“非常长的伪列表中选择一个位置 - 随机数"。

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

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

即这些是 2 个“独立”序列,(据我所知,这个“长列表”将由特殊的 PRNG 算法生成,很可能涉及模运算..?)

【问题讨论】:

  • 最好不要设置种子。 MATLAB 总是以相同的序列开始,但如果您在同一个 MATLAB 会话中运行两个计算,第二个计算将使用从第一个停止的地方开始的随机数序列,因此将保证不同且独立。除非您需要确保相同的随机数序列,否则根本不要使用种子。
  • 我不会使用同一个会话。它们是在后台和未知时间单独运行的脚本(可能使用 nohup nodesktop nosplash 等)。
  • 那么您可能想改用rng shuffle。使用它或多或少不可能两次获得相同的序列。

标签: matlab random random-seed


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。但是,您将如何“最大化”不得到相同或相似/重叠序列的概率?
  • @Machupicchu 通过不选择相同的种子两次。如果还有其他可能的话,它就不会像现在这样随机了。它的周期为2^19937-1,比10^6000 多,这也意味着对于大多数目的,即使您对300k 值的序列进行采样,您也不应该担心有两次相同序列的机会.如果您需要“更好”的随机性,请查看 random.org 或尝试找到加密安全的随机数生成器,但根据定义,这些随机数生成器要慢得多。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2014-01-11
    • 2022-07-11
    • 2012-09-28
    相关资源
    最近更新 更多