【问题标题】:produce same array in matlab and python with randn使用 randn 在 matlab 和 python 中生成相同的数组
【发布时间】:2020-10-14 04:49:01
【问题描述】:

您好,我正在尝试在 python 和 matlab 中生成相同的向量,但我无法得到它。 有人知道怎么做吗?

我的python代码是:

np.random.seed(1337)
A = np.random.randn(1,3)
A = array([[-0.70318731, -0.49028236, -0.32181433]])

我的matlab代码是:

rng(1337, 'twister');
A = randn(1,3)
A = -0.7832   -0.7012   -0.7178

我想同时给出相同的向量...

【问题讨论】:

  • 您可以在其中一个程序中创建矢量,将其保存到文件中,然后将其读入另一个程序中。
  • 每个编译器构建随机函数生成器的方式都不同,因此即使它们是伪随机数,matlab 和 python 之间的序列也不相同。我可能会在 python 中生成数据并将序列发送到 matlab。
  • 创建同一组随机数有什么意义?如果是出于测试目的以确保获得相同的结果,则创建一个测试方法并插入硬编码值或从文件中读取它们。

标签: python matlab random random-seed


【解决方案1】:

MATLAB 和 Python/NumPy,按照您的方式配置和使用,使用相同的伪随机数生成器。这个生成器产生相同的数字序列:

>> format long
>> rng(1337, 'twister');
>> rand(1,3)
ans =
   0.262024675015582   0.158683972154466   0.278126519494360
>>> np.random.seed(1337)
>>> np.random.rand(1,3)
array([[0.26202468, 0.15868397, 0.27812652]])

因此,从随机流中生成正态分布值的算法似乎有所不同。 There are many different algorithms to produce normally-distributed values from a random stream,而 MATLAB 文档没有提到它使用的是哪一个。 NumPy does mention at least one method:

用于生成 NumPy 法线的 Box-Muller 方法在 Generator 中不再可用。对于正态分布或任何其他依赖于正态分布的分布(例如 RandomState.gammaRandomState.standard_t),无法使用 Generator 重现精确的随机值。如果您需要按位向后兼容的流,请使用RandomState

简而言之,NumPy 有一个新的随机数系统 (Generator),旧系统仍然可用 (RandomState)。这两个系统使用不同的算法将随机流转换为正态分布的数字:

>>> r = np.random.RandomState(1337)
>>> r.randn(1,3)                        # same as np.random.randn()
array([[-0.70318731, -0.49028236, -0.32181433]])
>>> g = np.random.Generator(np.random.MT19937(1337))
>>> g.normal(size=(1,3))
array([[-1.22574554, -0.45908464,  0.77301878]])

rg 这里都产生相同的随机流(使用具有相同种子的 MT19937 生成器),但正态分布的随机数不同。

我找不到Generator.normal使用的算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2021-01-03
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多