【问题标题】:Are numbers generated by rand() in matlab dependent?matlab中由rand()生成的数字是否依赖?
【发布时间】:2019-01-04 09:17:04
【问题描述】:

我对 MATLAB 中的 rand() 有疑问。

我想知道 rand() 生成的数字是否有依赖关系。

比如我直接通过rand()生成一个1*2的矩阵N。

N(1) 会影响 N(2) 吗?如果 N(1) 为 0.2,那么 N(2) 大于或小于 0.2 的概率更高?

【问题讨论】:

  • 理论上不,它们是随机的。实际上,如果您要问,您将无法区分。
  • @MadPhysicist 我在 MATLAB 中通过 randsrc() 生成了一个 01 序列。序列的元素不是0就是1。这个函数在生成随机数的时候会用到rand(),可以指定1出现的概率。我可以把这个序列看成一个伯努利过程吗?
  • @roov:疯狂物理学家已经回答了你的问题。

标签: matlab math random random-seed


【解决方案1】:

没有特殊硬件,计算机无法真正生成随机数。他们使用算法来生成伪随机数,这些算法被称为伪随机数生成器(“PRNG”)。

对于 matlab,它使用Mersenne Twister 作为其default 生成器。 链接的 Wikipedia 条目很好地总结了 Mersenne Twister 的优点和缺点。

由于 PRNG 的工作方式,PRNG 的后续输出依赖的。或者正如 James Polk 所建议的,更准确的说法是后续值取决于内部状态,每次调用都会以一种确定性的方式发生变化。

如果您使用相同的值重新播种 PRNG,它将产生与以前相同的数字序列。请参阅下面的 Python 示例(也使用 Mersenne Twister)。

In [1]: import random                                                                                    

In [2]: random.seed('foobar')                                                                            

In [3]: [random.randint(0, 255) for j in range(15)]                                                      
Out[3]: [128, 127, 178, 80, 112, 31, 1, 234, 24, 206, 253, 213, 6, 215, 16]

In [4]: random.seed('foobar')                                                                            

In [5]: [random.randint(0, 255) for j in range(15)]                                                      
Out[5]: [128, 127, 178, 80, 112, 31, 1, 234, 24, 206, 253, 213, 6, 215, 16]

最终这个序列会自己重复。这被称为 PRNG 的“周期”。

如果这个 PRNG 刚刚启动,由于内部状态很大,它可能需要一段时间才能产生良好随机性的输出。您必须运行测试以查看 matlab 中是否是这种情况。可能是 matlab 开发人员在初始化生成器时处理了这个问题,即生成和丢弃大量随机数。

要对此进行测试,请使用 matlab 生成几个 1 kiB 的随机字节块。 然后使用例如dieharderent来检查和比较后续块的随机性。

【讨论】:

  • 检查两个块的数量是否相关是更难还是更难?我只想知道一个块中的数字是否依赖。
  • @roov 不,这些程序测试随机性。这些数字是相关的。
  • “依赖”可能比这更复杂。 PRNG 的输出依赖于内部状态,但充其量只是非常微弱地相互依赖。
  • 这些数字是不相关的,因为 Mersenne Twister 的一个周期会多次产生每个可能的整数(周期是 2^19937 - 1,只产生 2^32 个不同的整数)。因此,从序列中知道一个值,就不可能确定下一个是哪一个。你需要知道完整的内部状态。
猜你喜欢
  • 2013-03-08
  • 2015-07-01
  • 2012-09-06
  • 2020-11-06
  • 2010-09-10
  • 1970-01-01
  • 2021-10-16
  • 2022-09-23
  • 2020-06-26
相关资源
最近更新 更多